web-dev-qa-db-ja.com

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

に相当するものを見つけたい

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

しかし、forループ内で表現されたコマンド

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

最初の表現と同等のものを見つけるために、2番目の表現を変更することをどのように提案しますか?

24
user123456

元のシーケンスと同等のものは次のとおりです。

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

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

54
jlliagre

汚い1行のソリューションが必要な場合は、コマンドを作成してbashに送信できます。

echo "cmd "{1..20}" &&" : | bash
9

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

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

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

 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からの64バイト(172.217.26.174):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

0
SuperKrish