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


162

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

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

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


3
どこに置いたの?if ! [[ ...作品
その他の男

1
次のように使用することもできます:wget your_xxxx_params || (echo "oh oh" && exit 1)
AKS

2
>エラーを出力するためだけにサブシェルを呼び出す
tijagi

回答:


227

選んでいいですよ:

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

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

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

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


9
二重括弧は必要ですか?何故ですか?
Alexander Mills

1
@AlexanderMills:これを行うにはいくつかの方法があります。ダブルブラケットまたはシングルブラケット、またはtestコマンド:if test $? -ne 0; then
Cyrus

4
この答えは不必要な冗長です。ifあなたはコマンド自体を使用して、それ反転させることができるので、0または1である文を見込ん:if ! wget ...; then ...; fi
ニルス・マグヌス


8

怠惰に感じている場合は、操作後に||(または)および&&(および)を使用して条件を処理する簡単な方法を次に示します。

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

8
実際のスクリプトでは&&、echoコマンドの後をに変更する必要があります;。これは、出力がディスク全体のファイルにリダイレクトされている場合、がecho失敗を返し、が起動しexitないためです。これはおそらく、希望する動作ではありません。
Score_Under

または、使用してset -eも失敗しechoてもスクリプトは終了します
Jakub Bochenski '13

4

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

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"

完璧に動作します。$?ただし、これは特別なパラメーターには適用されません。

さらに、(( ... ))ゼロ以外の値を真に評価する、つまり、ゼロ以外の値の戻りステータスは0であり、それ以外の場合の戻りステータスは1であるため、次のように短縮できます。

if (( $? )); then

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

(( ... ))構築物は、バッシュで利用可能であるが、必要によってはないPOSIXシェル仕様(ただし、可能な拡張として記載します)。

これはすべて言わ$?れていますが、私の意見では、コールの回答スティーブンの回答ように、完全に回避することをお勧めします



@ DavidC.Rankinああ、私はそれを見つけられませんでした!したがって、これは拡張機能として言及されていますが、必須ではありません。修正します。
ベンジャミンW.

1
はい、それはいつも私も得ました。それは確かにシェルでの生活をより簡単にします:)
デビッドC.ランキン

4

-ne代わりに不等比較を使用できます-eq

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.