#
ドキュメント

Document

自分のための備忘録です。

シェルの条件式は他のプログラム言語と比べて特徴があると感じています。
備忘録として条件式についてメモします。

test コマンド

シェルで条件式を評価するコマンドにtestがあります。
testコマンドの例です。

str="aaa"
if test "$str" = "aaa"; then
  echo "same"
fi

# 出力
# same

[ ]

[ ]testコマンドの糖衣構文になります。
[ ] の例です。

str="aaa"
if [ "$str" = "aaa" ]; then
  echo "same"
fi

# 出力
# same

[[ ]]

Bash は [ ] より高機能な [[ ]] を使用できます。
例えば [[ ]] は正規表現を使用できます。

str="abc"
if [[ $str =~ ^a.+$ ]]; then
  echo "match"
fi

# 出力
# match

※ 正規表現はクォートや / などで囲みません。

( )

多くのプログラム言語で条件式を表す ( ) はシェルには出てきていません。

  • ( )はコマンド郡をサブシェルで実行します
  • ( )$(command)のようにコマンド置換でを使用します

( ) を使ったコマンド置換の例です。

# pwd
# /home/foo に位置

echo $(cd /home/foo/bar; pwd)
# /home/foo/bar

# pwd
# /home/foo

意味のないの例ですがコマンド置換を条件式に使用する例です。

if (pwd); then
  echo "something"
fi

# 出力
# /home/foo
# something

少し意味のある例を考えます。

echo -e "aaa\nbbb\nccc" > tmp.txt

if (grep "aaa" tmp.txt > /dev/null); then
  echo "match"
fi

# 出力
# match

if (grep "ddd" tmp.txt > /dev/null); then
  echo "match"
fi

# 出力
# 条件を満たしていないのでなにも表示されません。

上記は (grep "aaa" tmp.txt > /dev/null) は正常終了 ( exit 0 ) 、 (grep "ddd" tmp.txt > /dev/null) は異常終了 ( exit 0 以外) することを使用しています。
コマンドの実行結果は $? で取得できます。

(( ))

さらに (( )) を算術の条件式に使用できます。

count=5

if (( count < 10 )); then
  echo "5 is less than 10"
fi

# 出力
# 5 is less than 10

(( )) の中は $ は必要ありません。

以上条件式についてまとめみました。