シェルスクリプトの&&スタイルプログラミング(仮称)

Tue Jul 9 13:23:07 JST 2013 (modified: Sun Oct 6 16:06:15 JST 2019)
views: 1828, keywords:プログラミング,シェルスクリプト,&&,昼休みに書いた この記事は最終更新日が5年以上前のものです。

また小ネタ。コマンドをパイプでなくて && でつなぐと面白い事ができます。

例えばこんなスクリプト。

uedamac:~ ueda$ cat hoge.sh
   #!/bin/bash -xv
   
   #ダミーのファイル
   echo aaa > hoge
   
   #新しいデータを作って差し替える
   echo bbb > hoge.new
   #絶対にhogeファイルを壊したくない
   cp -p hoge hoge.org
   mv hoge.new hoge

普通、エラー処理を入れるとこうなります。はっきり言って汚い。 (補足:echo bbb > hoge.new || exit 1でもいいですね。いちいちテストコマンドを使うのは私の癖です。)

uedamac:~ ueda$ cat hoge2.sh
   #!/bin/bash -xv
   
   #ダミーのファイル
   echo aaa > hoge
   
   #この hoge.new を hogeに置き換えたい
   echo bbb > hoge.new
   [ $? -eq 0 ] || exit 1
   #絶対にhogeファイルを壊したくない
   cp -p hoge hoge.org
   [ $? -eq 0 ] || exit 1
   mv hoge.new hoge
   [ $? -eq 0 ] || exit 1

でも、こういう書き方をすると汚さが減ります。

uedamac:~ ueda$ cat hoge3.sh 
   #!/bin/bash -xv
   
   #ダミーのファイル
   echo aaa > hoge
   
   #この hoge.new を hogeに置き換えたい
   echo bbb > hoge.new &&
   #絶対にhogeファイルを壊したくない
   cp -p hoge hoge.org &&
   mv hoge.new hoge
   [ $? -eq 0 ] || exit 1

&& はコマンドが失敗したところで止まるので、echo, cp共に正常終了しないとmvに移行できません。

例えば次の例のようにcpでエラーを起こすとmvは実行されません。

uedamac:~ ueda$ ./hoge3.sh 
   #!/bin/bash -xv
   
   #ダミーのファイル
   echo aaa > hoge
   + echo aaa
   
   #この hoge.new を hogeに置き換えたい
   echo bbb > hoge.new &&
   #絶対に失敗したくない
   cp -p huge hoge.org &&
   mv hoge.new hoge
   + echo bbb
   + cp -p huge hoge.org
   cp: huge: No such file or directory
   [ $? -eq 0 ] || exit 1
   + '[' 1 -eq 0 ']'
   + exit 1

マシンの設定に使うシェルスクリプトの場合、パイプはあまり使わないでしょうから、&&でつなぐ事を覚えておけばエラーしたままスクリプトが暴走するのを簡単に止めることができるようになるでしょう。-eオプションもあるけど、私はこっちの方が好きです。細かい制御ができるので。

コマンドをつなぐのは何もパイプだけでない、ということで。 終わり。

ノート   このエントリーをはてなブックマークに追加 
 

prev:sshで接続失敗したら別のssh接続を試すシェルスクリプト next:Pythonのround関数の-0.0はどうにかならんのでしょうか?

やり散らかし一覧

記事いろいろ