rcmdnk's blog

[チビジュエルズ] chibi jewels シェルネックレス(Neptune) N085 Neptune Shell Necklace

シェルスクリプトをif文を書き換えてる時に気づいた点についての備忘録。

if文を短く書き換え

シェルスクリプトで

1
2
3
4
5
n=2
if [ $n -eq 1 ];then
  echo "n is 1"
fi
echo $?

みたいな文をAND(&&)を使って

1
2
3
n=2
[ $n -eq 1 ] && echo "n is 1"
echo $?

こんな風に短く出来ます。

終了ステータスが違う

上の二つは同じ様な機能を持つので、 この切替はなんとく見た目が良い感じになるように、の程度でやってましたが、 nが1でない時に終了ステータスが変わります。

上の場合はif文にはnが整数である限り間違いはないのでこの部分は正常終了し if文後は$?が0になってます。

一方、下の方は最初の判定が偽でその時点で下に行くので$?は 失敗ステータスの1が入ってます。

それ程終了ステータスを使う事はないかもしれませんが、 スクリプトの最後に

1
2
...
[ $verbose -ge 1 ] && echo "$summary"

的な、まとめを場合によっては表示する、みたいなスクリプトだったりすると、 普段この表示を止めてる場合にスクリプトの終了ステータスが0で 無くなってしまったりすることも。

ステータスを見る様なスクリプトはきちんとexit 0とか関数ならreturn 0 しとくべきですが割りと適当にやってると忘れてしまうので注意、と。

おまけ: 三項演算子にしてしまう

上の様に変換するときに最後に|| :を付けて

1
[ $verbose -ge 1 ] && echo "$summary" || :

としてやれば、verboseが1より小さい時は:が実行されて(つまり何もされない) 終了ステータスが0になるのでif文と同じ様にも出来るな、とも。

Sponsored Links
Sponsored Links

« シェルスクリプトのreadでControl-a等を読み取る: ANSI C quoting Zshの配列要素を消す方法 »

}