Это просто даст Вам сильно поврежденную систему. Почему Вы хотите сделать что-то это причудливое во-первых?
Я подозреваю, что это - проблема XY: Вы нуждаетесь X, выясняете, что способ сделать это через Y, и спросите о Y. Не зная, какой X, нет никакого способа, которым мы могли дать разумные решения для него.
Кажется, вы сбиты с толку относительно условных обозначений в сценариях оболочки. Каждая команда оболочки имеет статус выхода, который представляет собой целое число от 0 до 255, где 0 означает успех, а любое другое значение означает сбой. Такие операторы, как if
и while
, которые ожидают логические операнды, проверяют статус выхода команды и рассматривают 0 (успех) как истину, а любое другое значение (неудача) как ложь.
Например, команда grep
возвращает 0, если шаблон найден, и 1, если шаблон не найден. Итак,
while ifconfig | grep "192.168.100." > /dev/null; do …
повторяет цикл до тех пор, пока шаблон 192.168.100.
находится в выходных данных ifconfig
. Обратите внимание, что шаблон 192.168.100.
соответствует таким строкам, как 192x168 1007
, потому что .
в регулярном выражении соответствует любому символу; для поиска буквальной строки передайте параметр -F
в grep
. Чтобы инвертировать условие, положите !
впереди.
while ! ifconfig | grep -F "192.168.100." > /dev/null; do …
Далее в сценарии вы хотите сравнить значение переменной с числом. Вы используете оператор -gt
, который является частью синтаксиса условных выражений of , понимаемых командой test
. Команда test
возвращает 0, если условное выражение истинно, и 1, если условное выражение ложно.
if test "$x" -gt 200; then
Обычно используется альтернативное имя [
для команды test
. Это имя предполагает, что команда завершится параметром ]
. Два способа написания этой команды полностью эквивалентны.
if [ "$x" -gt 200 ]; then
Bash также предлагает третий способ записи этой команды со специальным синтаксисом [[…]]
. Этот специальный синтаксис может поддерживать на несколько больше операторов, чем [
, потому что [
- обычная команда, подчиняющаяся обычным правилам синтаксического анализа, а [[…]]
- часть синтаксиса оболочки.
И снова имейте в виду, что [
предназначен для условных выражений , которые представляют собой синтаксис с такими операторами, как -n
, -gt
],… [
не означает «логическое значение»: любая команда имеет логическое значение (статус выхода = 0?).
Ваш способ определения того, что сеть работает, не является надежным. В частности, обратите внимание, что ваш сценарий будет запущен, как только какой-либо сетевой интерфейс получит IP-адрес в указанном диапазоне. В частности, вполне возможно, что на этом этапе DNS еще не будет работать, не говоря уже о подключенных сетевых ресурсах.
Вам действительно нужно запускать эти команды, когда кто-то входит в систему? Когда сеть подключена, проще сделать так, чтобы команда выполнялась автоматически. Способ сделать это зависит от вашего дистрибутива и от того, используете ли вы NetworkManager.
Если вам нужно запустить эти команды как часть сценариев входа в систему, то проверьте ресурс, который вам действительно нужен, а не наличие IP-адреса. Например, если вы хотите проверить, смонтирован ли / net / somenode / somedir
, используйте
while ! grep -q /net/somenode/somedir </proc/mounts; do
sleep 1
done
, вы можете его использовать. Например, с Upstart , отметьте свою работу как start on net-device-up eth0
(замените eth0
именем интерфейса, который обеспечивает желаемое сетевое соединение). Для Systemd см. Вызов сценария для выполнения после запуска сети?
Просто посчитайте вывод ip add show
Например:
root@xxxxxxlp01 ~ $ ip add sh dev eth3 | grep inet
root@xxxxxxlp01 ~ $ ip add sh dev eth1 | grep inet
root@xxxxxxlp01 ~ $ ip add sh dev eth0 | grep inet
inet xxx.xxx.64.91/24 brd xxx.xxx.95.255 scope global eth0
inet6 fe80::224:e8ff:fe78:4dfb/64 scope link
root@xxxxxxlp01 ~ $ ip add sh dev eth0 | grep inet | wc -l
2
Затем вы можете просто перейти по номеру возвращаемой строки, если это необходимо. Вы, вероятно, просто проверите, было ли оно нулем, и если да, то засыпайте и повторите цикл.
Непроверенный код для иллюстрации:
while [ 1 ]; do
if [ $(ip add sh dev eth0 | grep inet | wc -l) -ne 0 ]; then
break
fi
sleep 1
done
Ping вернет ответ 0, если хотя бы одна попытка была успешной. Вы можете проверить связь с сервером, к которому вы подключаетесь, до тех пор, пока он не будет успешным.
Вы можете использовать команду hostname
.
с опцией -I
, вы получите свой локальный IP-адрес, который будет возвращен вашим DHCP-сервером.
hostname -I
# (if has network) return: 192.168.100 or other IP local
Проверьте этот очень простой пример:
while [ "$(hostname -I)" = "" ]; do
echo -e "\e[1A\e[KNo network: $(date)"
sleep 1
done
echo "I have network";
Я думал и проверял другие ответы.
И, возможно, если вы хотите проверить подключение к вашему серверу.
Я расшифровываю тот же сценарий, но теперь жду соединения с сервером.
# ip server
serverAdr="192.168.0.1"
ping -c 1 $serverAdr > /dev/null 2>&1
while [ $? -ne 0 ]; do
echo -e "\e[1A\e[K $(date): Connecting - ${serverAdr}"
sleep 1
ping -c 1 $serverAdr > /dev/null 2>&1
done
echo "$(date): Connected - ${serverAdr}";