Як замінити 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

Різниця у відповіді Amit полягає в тому, що сценарій не вийде, тобто виконує потенційні команди, які можуть слідувати послідовності / циклу. Зауважте, що стан повернення всього циклу завжди буде істинним з моєї пропозиції, це може бути виправлено, якщо це стосується вашого випадку.


1
Погоджено, це більш уважно слідкує за поведінкоюcmd && cmd
Amit Gold


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 ping статистика --- 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 мс

--- yahoo.com ping статистика --- 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.