Как заменить AND (&&) в цикле for?


24

Я хотел бы найти эквивалент

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

но с командами, выраженными внутри forцикла, как

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

Что бы вы предложили изменить во втором выражении, чтобы найти эквивалент первого?

Ответы:


54

Эквивалентом вашей исходной последовательности будет:

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

Разница с ответом Амита заключается в том, что скрипт не будет завершен, т.е. будет выполнять потенциальные команды, которые могут следовать последовательности / циклу. Обратите внимание, что возвращаемое состояние всего цикла всегда будет истинным с моим предложением, это может быть исправлено, если это уместно в вашем случае.


1
Согласен, это более точно следует за поведениемcmd && cmd
Амит Голд


8

Вы можете выйти из цикла, если один из них потерпел неудачу

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) байт данных. 64 байта с google.com (172.217.26.174): icmp_seq = 1 ttl = 56 время = 259 мс

--- статистика пинга google.com --- 1 отправлено пакетов, 1 получено, потеря пакетов 0%, время 0 мс rtt мин / avg / max / mdev = 259,794 / 259,794 / 259,794 / 0,000 мс yahoo.com PING yahoo.com ( 98,138.253.109) 56 (84) байтов данных. 64 байта с yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 время = 398 мс

--- Статистика ping yahoo.com --- 1 переданных пакетов, 1 полученный, 0% потерь пакетов, время 0 мс rtt мин / avg / max / mdev = 398,974 / 398,974 / 398,974 / 0,000 мс

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.