$ grep "apple" fruits.txt
apple
$ if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
A
上記のコマンドを実行するとうまく機能しますが、このコマンドをシェルスクリプトとして実行するとエラーが発生し、Bが印刷されます。なぜこれが起こるのですか?
$ sh temp.sh
apple
temp.sh: 3: [: 0: unexpected operator
B
答え1
問題は、bashがサポートする恒等演算子を使用しているがサポートしていない==
スクリプトを実行していることです。sh
解決策は、次のものを交換することです。
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
そして:
if [ $? = 0 ] ; then echo "A"; else echo "B"; fi
これはbash
アンダーとプレーンで動作しますsh
。
この特別なケースには違いはありませんが、=
文字列比較です。数値的等価性をテストするには、以下を使用する必要があります-eq
。
if [ $? -eq 0 ] ; then echo "A"; else echo "B"; fi
例は次のとおりです。==
次のスクリプトファイルを考えてみましょう。
$ cat script.sh
grep "apple" fruits.txt
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
bashで実行されます。
$ bash script.sh
apple
A
ダッシュでは失敗します(ダッシュはDebianシリーズシステムのデフォルトshです)。
$ dash script.sh
apple
script.sh: 2: [: 0: unexpected operator
B
このエラーメッセージは、行番号を除いて現在表示されているものと一致することを示しています。
単純化する
$?
直接アクセスは必要ありません。コードは次のように単純化できます。
$ if grep "apple" fruits.txt; then echo "A"; else echo "B"; fi
apple
A
または論理AND&&
および論理OR、、||
演算子を使用します。
grep "apple" fruits.txt && echo A || echo B
上記のコードは、echo A
実行すると常に成功を返すため、機能します。
答え2
1つのオプションは、比較したいローカル環境と同様に、bashスクリプトで実行することです。
bashでスクリプトを実行するには、次のプログラムの最初の行にします。
#!/usr/bin/env bash