Поиск по сайту:

Как повторять команду до тех пор, пока она не будет выполнена в Linux

В этом кратком руководстве мы научимся повторять команду до тех пор, пока она не будет успешной в Linux. Это может быть полезно во многих случаях. Например, вы можете использовать этот метод для проверки сетевого подключения между двумя или более хостами или проверить подключение к Интернету, чтобы узнать, находитесь ли вы в сети или офлайн. Итак, какова бы ни была причина, если вы когда-нибудь хотели повторить команду или программу Linux до тех пор, пока она не завершится успешно, это руководство вам поможет.

Повторяйте команду до тех пор, пока она не будет успешной в Linux

Для многократного выполнения списка команд мы используем следующие конструкции цикла BASH:

  1. Пока цикл,
  2. До цикла.

Пока выполняет блок кода (заключенный в do ... Done), когда условие истинно и продолжает выполнять это до тех пор, пока условие не станет false. Как только условие становится ложным, цикл while завершается.

Цикл «Пока» является противоположностью цикла «Пока». Он выполняет блок кода (заключенный в do ... Done), когда условие false, и продолжает выполнять его до тех пор, пока условие не станет false.правда. Как только условие станет истинным, цикл до завершения завершается.

Во-первых, давайте посмотрим, как повторять команду или программу Linux до тех пор, пока она не достигнет успеха, используя цикл While.

1. Повторение команд с использованием цикла while

Посмотрите следующую команду:

while ! ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc

Эта команда будет продолжать попытки пинговать сайт ostechnix.com. Как только сайт появится в сети, цикл while завершится и отобразится программа "xcalc". Здесь xcalc не является обязательным. Это просто для уведомления. В противном случае нам, возможно, придется продолжать проверять окно терминала, чтобы проверить, выполнена ли команда успешно или нет.

Объяснение:

Давайте разберем приведенную выше команду и посмотрим, что делает каждый оператор.

while ! ping -c 3 ostechnix.com ;

Это условное утверждение. Как вы видите в этом операторе, мы предваряли команду ping символом !. Оно служит условием НЕ. Таким образом, фактическое значение приведенной выше строки таково: хотя НЕ может выполнить проверку связи с ostechnix.com.

do sleep 2 ; done ;

Утверждение "do Sleep 2" указывает на то, что не перегружайте систему повторными попытками выполнения команды ping каждую секунду. Даем системе команду подождать немного, например 2 секунды, а затем попробовать пропинговать ostechnix.com. Другими словами, команда While будет проверять сайт каждые 2 секунды. Как только условие станет ложным, цикл while завершится.

xcalc ;

Запустите программу xcalc. Эта программа запустится только после успешного выполнения предыдущей команды.

Итак, согласно приведенной выше команде, если условие истинно (т.е. если ostechnix.com «НЕ» доступен), он выполнит блок кода, заключенный в do...done. Здесь код «сон 2». Поэтому он ждет 2 секунды, а затем снова пытается пропинговать сайт. Он будет продолжать выполнять это до тех пор, пока условие не станет ложным. Как только условие станет ложным (т. е. если ostechnix.com доступен), цикл завершится и, наконец, откроется программа xcalc.

Вот пример вывода приведенной выше команды:

ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
ping: ostechnix.com: Name or service not known
PING ostechnix.com (104.26.5.40) 56(84) bytes of data.
64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=1 ttl=55 time=63.6 ms
64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=2 ttl=55 time=84.8 ms
64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=3 ttl=55 time=79.9 ms

--- ostechnix.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 63.602/76.114/84.810/9.068 ms
Warning: Cannot convert string "-adobe-symbol-*-*-*-*-*-120-*-*-*-*-*-*" to type FontStruct

2. Повторение команд с использованием цикла «До»

Вы также можете сделать это, используя цикл «До», как показано ниже.

until ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc

Давайте разберем эту команду и посмотрим, что делает каждый оператор:

until ping -c 3 ostechnix.com ;

Это условное утверждение. Это значит — пинговать до тех пор, пока сайт не станет доступен.

do sleep 2 ; done ;

Попробуйте пинговать сайт каждые 2 секунды, пока он не станет доступен. Как только условие станет истинным, т. е. сайт станет доступным, цикл будет завершен.

xcalc

Запустите программу xcalc. Он запустится только после успешного выполнения предыдущих команд.

Итак, согласно приведенной выше команде, цикл «До» будет продолжать проверять ostechnix.com до тех пор, пока не будет выполнено успешно. Как только сайт станет доступным, цикл до завершения завершится и откроется программа xcalc.

Связанное чтение:

  • Как запускать команды Linux каждые X секунд и всегда

3. Повторите предыдущие команды

Теперь мы знаем, как выполнять команду Linux до успешного завершения. А как насчет предыдущей команды? Как повторять или повторять предыдущие команды, пока они не будут успешными? Это тоже легко!

Мы уже публиковали разные способы повторения последней команды. Если вы не знаете, как это сделать, обратитесь к следующему руководству.

  • Различные способы повторить последнюю команду в Linux

Как указано в приведенной выше ссылке, чтобы выполнить любую последнюю выполненную команду, просто введите двойные восклицательные знаки и нажмите ENTER, как показано ниже:

!!

Это выполнит последнюю команду.

Итак, если вы хотите повторять предыдущие команды до тех пор, пока они не будут успешными, используя цикл While, запустите:

!!; while [ $? -ne 0 ]; do !!; done

Чтобы повторять предыдущие команды до тех пор, пока они не будут успешными, используя цикл «До», запустите:

$ until !!; do :; done

Дополнительные примеры использования циклов While и Until в Bash см. в следующем руководстве:

  • Скрипты Bash: циклы while и Until с примерами

Статьи по данной тематике