添削:業務で楽するためのUNIXテクニック集 まずはおさらい、シェル制御構造と正規表現の基礎:CodeZine

幾つか気になる点があるので書いておくよ。
執筆者KEIさんが修正してくださったので、以下の記事は既に古いものとなっている

コマンドが左から右に順に実行されます。コマンド1が正常終了(終了コードが0)したら、コマンド2が実行されます。

コマンド1 ; コマンド2 ; ...
業務で楽するためのUNIXテクニック集 まずはおさらい、シェル制御構造と正規表現の基礎:CodeZine

コマンド1が正常終了しなくてもコマンド2は実行されます。


なお for文では、次のように条件の設定を指定することもできます。

for ((i=0; i<5; i++)); do echo "$i"; done
業務で楽するためのUNIXテクニック集 まずはおさらい、シェル制御構造と正規表現の基礎:CodeZine

C言語っぽくて開発者には分かり易いかもね。
僕としては

for i in $(seq 0 5); do echo "$i"; done

を使っちゃうけどね。
seqコマンドはLinuxではcoreutilsに入っているはずで商用UNIXとかでなければ大抵入っているはず。フォーマットとかインクリメント数も指定できるので時たま便利。詳しくはmanを見てね


$ find ./ -type f | while read file; do wc -l "$file"; done
3 ./sec1.txt
4 ./sec2.txt
5 ./sec3.txt

業務で楽するためのUNIXテクニック集 まずはおさらい、シェル制御構造と正規表現の基礎:CodeZine

whileの用例だから良いけど。

file ./ -type f -print0 | xargs -0 wc -l

を使うとより簡潔かな。
簡潔に書こうとする場合にwhile readは滅多に使わないと思う。シェルスクリプトでちょいと複雑な事をしたい場合に

hogehoge | while read field1 field2 field3
do
  if [[ "$field1" = foo* ]];then
    #...
  fi
done

とかするときはあるけど。まぁこれもあまり使わなくてawkとかperlを使った方が楽な場合が多い。



ifについて、(whileもそうだが)全体的に間違いがある。
ifはコマンドの終了コードが0かそれ以外かで分岐する。ので「条件」という表現は微妙。例えば

if grep hoge file >/dev/null
then
  echo OK
else
  echo NG
fi

という書き方はきちんと成立する。これはgrepコマンドがfile内のhogeを検索して見つかった場合には終了コード0を何も見つからなかった場合には1を返すことを利用した書き方だ。

因みに[ ... ]testコマンドと同等、(( ... ))letコマンドと同等、[[ ... ]]はコマンドには置き換えられないが終了コードを返す書き方となっている。詳しくはman bashを見てね

if文の短縮形として、前述のリストを利用することで、次のような指定もできます。

条件1 && 条件1が成立した時に実行するコマンド  || 条件1が不成立の時に実行するコマンド
業務で楽するためのUNIXテクニック集 まずはおさらい、シェル制御構造と正規表現の基礎:CodeZine

違う。「条件1」が成立して「条件1が成立した時に実行するコマンド」が終了コード0以外を返した場合も、||以降のコマンドは実行される。

そういえば、bashの書き方でいつも紹介されないのが、Shellの[[ ... ]]と[ ... ]の違いなんだけど何でだろう。ハマっている人は多そうなのに。