如何在for循环中替换AND(&&)?


24

我想找到一个等价的

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

但是在for循环之内表达的命令

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

您建议在第二个表达式中进行什么更改以找到与第一个表达式相同的内容?

Answers:


54

与您的原始序列等效的是:

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

与Amit答案的区别在于脚本不会退出,即将执行可能遵循序列/循环的潜在命令。请注意,根据我的建议,整个循环的返回状态将始终为true,如果与您的情况相关,则此状态可能是固定的。


1
同意,这更接近于用户的行为cmd && cmd
阿米特·金


8

如果其中之一失败,您可以跳出循环

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

1
就像@jiliagre指出的那样(并在其回答中提供了更正),这不会“脱离循环”,它会退出调用shell。
奥利维尔·杜拉克

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最小值/平均值/最大值/ mdev = 259.794 / 259.794 / 259.794 / 0.000毫秒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最小值/平均值/最大值/ mdev = 398.974 / 398.974 / 398.974 / 0.000毫秒

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.