web-dev-qa-db-ja.com

bashスクリプトでif条件を否定する

私はbashを使うのが初めてなので、次のコマンドを無効にしようとしています。

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

インターネットに接続している場合、このif条件はtrueを返します。逆のことをしたいのですが、どこかに!を置いてもうまくいかないようです。

122
Don Drenai

選んでいいですよ:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

!は、それぞれ次の式の戻りを反転します。

166
Cyrus

良い

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi
70
Steven Penny

あなたが怠惰に感じているならば、これは操作の後に||(or)と&&(and)を使って条件を扱う簡潔な方法です:

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
8
Cole Tierney

数値を比較しているので、 算術式 を使用することができます。これにより、パラメーターと比較の処理が簡単になります。

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

-neの代わりに、!=を使用できることに注目してください。算術の文脈では、$をパラメータの前に付ける必要すらありません。

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

完璧に動作します。ただし、これは$?特殊パラメータには当てはまりません。

さらに、(( ... ))はゼロ以外の値をtrueと評価します。つまり、ゼロ以外の値の場合は戻り値0、それ以外の場合は戻り値1となるため、次のように短縮できます。

if (( $? )); then

しかし、これは節約されたキーストロークが価値があるより多くの人々を混乱させるかもしれません。

(( ... ))構文はBashで利用可能ですが、 POSIXシェル仕様 (ただし可能な拡張子として言及されています)では必要ありません。

これはすべて言われているので、 Cole's answer および Steven's answer のように、私の考えでは$?を完全に避けた方が良いです。

4
Benjamin W.

-neの代わりに等しくない比較-eqを使うことができます。

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
4
davidhigh