forループでAND(&&)を置き換えるにはどうすればよいですか?


24

私は同等のものを見つけたい

cmd 1 && cmd 2 && ... && cmd 20

しかし、次のforようなループ内で表現されたコマンド

for i in {1..20}
do
   cmd $i
done

最初の式に相当するものを見つけるために、2番目の式で何を変更することを提案しますか?

回答:


54

元のシーケンスに相当するものは次のとおりです。

for i in {1..20}
do
   cmd $i || break
done

Amitの答えとの違いは、スクリプトが終了しないことです。つまり、シーケンス/ループに従う可能性のある潜在的なコマンドを実行します。私の提案では、ループ全体の戻りステータスが常に真であることに注意してください。これは、あなたのケースに関連する場合は修正されるかもしれません。


1
合意された、これはより密接の動作は以下cmd && cmd
アミットゴールド


8

それらの1つが失敗した場合、ループから抜け出すことができます

for i in {1..55}; do
    if ! cmd $i; then
        exit 1
    fi
done

1
@jiliagreが述べたように(そして彼の答えに修正を加えたように)、これは「ループから抜け出す」のではなく、呼び出しシェルを終了します。
オリビエデュラック

1
breakそこでは合法ではありませんか?私はif声明が邪魔しないと確信しています
。– jpaugh

0

これは、使用せずにターミナルでタスクを実行する方法です &&

 for i in google.com yahoo.com;do ping -c1 $i;echo $i;done

同様に、このコマンドをスクリプトに入れる必要があります

 for i in google.com yahoo.com
    do echo $i;ping -c1 $i;
  done

両方が私に同じ出力を与えます

google.com PING google.com(172.217.26.174)56(84)バイトのデータ。google.com(172.217.26.174)からの64バイト:icmp_seq = 1 ttl = 56 time = 259 ms

--- google.com ping統計--- 1パケット送信、1受信、0%パケット損失、時間0ms rtt min / avg / max / mdev = 259.794 / 259.794 / 259.794 / 0.000 ms yahoo.com PING yahoo.com( 98.138.253.109)56(84)バイトのデータ。yahoo.com(98.138.253.109)からの64バイト:icmp_seq = 1 ttl = 51 time = 398 ms

--- yahoo.com ping統計--- 1パケット送信、1受信、0%パケット損失、時間0ms rtt min / avg / max / mdev = 398.974 / 398.974 / 398.974 / 0.000 ms

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.