添削:業務で楽するための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
業務で楽するためのUNIXテクニック集 まずはおさらい、シェル制御構造と正規表現の基礎:CodeZine
3 ./sec1.txt
4 ./sec2.txt
5 ./sec3.txt
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の[[ ... ]]と[ ... ]の違いなんだけど何でだろう。ハマっている人は多そうなのに。