シェルでif文はif [ 条件式 ]; then ...
のような感じで書くことが多いですが、[
は実はtest
コマンドへのエイリアスでしかなく、"${var}" = 'hoge'
のような比較を行っているのは、実はtest
コマンドです。
if
はtest
コマンドの終了ステータスが0かそれ以外かしか見ていません。
そのため、if
のあとに置くコマンドは、test
以外のなんでもokです。
ためしに、grep
をtest
コマンドのかわりに使って、標準入力に渡された文章が質問かそうでないかを判断するスクリプトを書いてみます。
ezoe.sh
#!/bin/sh
# ^ 行頭
# ..* 任意の1文字以上
# [??]* 全角のはてなと半角のはてな0個以上
# $ 行末
if grep '^..*ですか[??]*$' > /dev/null; then
echo "質問である"
else
echo "質問ではない"
fi
実行結果(入力文が質問の場合)
$ echo 'ご注文はうさぎですか?' | ./ezoe.sh
質問である
$ echo 'ご注文はうさぎですか?' | ./ezoe.sh
質問である
$ echo 'ご注文はうさぎですか' | ./ezoe.sh
質問である
実行結果(入力文が質問でない場合)
$ echo 'ご注文はうさぎです' | ./ezoe.sh
質問ではない
bashのPOSIX互換モードとdashで試しました。