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

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

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

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

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

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

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

решение1

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

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

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

решение2

Если вам нужно грязное однострочное решение, вы можете создать команду и отправить ее в bash.

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

решение3

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

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

решение4

Вот как я выполняю свои задачи в терминале без использования&&

 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 мс

--- статистика ping google.com --- 1 пакет передан, 1 получен, 0% потери пакетов, время 0 мс rtt мин/ср/макс/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 мин/ср/макс/mdev = 398,974/398,974/398,974/0,000 мс

Связанный контент