Intereting Posts

Shell Scripting: Сравнивая что-то с ничем?

У меня есть этот скрипт, чтобы проверить подключение к Интернету. Я использую ping для этого. Всякий раз, когда я использую ping google.com -c 4 | grep time ping google.com -c 4 | grep time он производит непустой ответ. Что-то вроде 64 bytes from hkg03s11-in-f4.1e100.net (173.194.127.68): icmp_req=2 ttl=52 time=90.6 ms . Но, когда связь отключена, time часть не появляется, поэтому, когда я выполняю ту же команду, она отображается как пустая. Как использовать, if для этого? Я смущен, следует ли использовать " " или "" .

Какой из них я использую?

if [ 'ping google.com -c 4 | grep time' != " " ]; then

или

if [ 'ping google.com -c 4 | grep time' != "" ]; then

Обратите внимание на пробел между ""

[ … != " " ] Сравнивает левую часть со строкой, содержащей одно пространство. [ … != "" ] Сравнивает левую сторону с пустой строкой. Программирование оболочки имеет странности и ловушки, но этот конкретный случай прост.

'ping google.com -c 4 | grep time' 'ping google.com -c 4 | grep time' – буквальная 32-символьная строка. Предположительно, вы предполагали использовать вывод команды, то есть команду susbtitution . Вы можете использовать обратные кавычки для этого (вместо используемых котировок вперед) или скобки в долларах, которые более читабельны и менее подвержены ошибкам в некоторых сложных случаях. В любом случае вам нужны двойные кавычки вокруг всего, иначе результат подстановки команды будет разделен на слова и дальнейшую гадость .

 if [ "$(ping google.com -c 4 | grep time)" != "" ]; then … 

Все это довольно крутой, хрупкий способ тестирования подключения. Вместо этого используйте статус возврата из ping . Возможно, достаточно одного пакета, и вы должны указать довольно небольшой тайм-аут в случае, если сеть не работает. Pinging google.com проверяет, работают ли IP-соединения и DNS. Вы можете 8.8.8.8 ping 8.8.8.8 чтобы проверить, работает ли подключение IPv4 (8.8.8.8 – сервер, выполняемый Google).

 if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then echo "The network is up" else echo "The network is down" fi 

См. Также Shell Scripting: Правильный способ проверить подключение к Интернету?

как насчет

  if ping google.com -c 4 then ... OK else ... not OK fi 

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

Чтобы ответить на исходный вопрос, вы не можете напрямую писать пустую строку, вы должны использовать

 if [ x'ping google.com -c 4 | grep time' != x ]; then 
  • если ping google.com -c 4 | grep time ping google.com -c 4 | grep time дать пустую строку x будет равно x

Между двумя альтернативами, которые вы предоставили, позже один правильный:

if [ 'ping google.com -c 4 | grep time' != "" ]; then

Вы можете сохранить something в переменной, например var , и проверить, не пусто ли это с помощью [ -z "$var ]" . Если он пуст, его статус выхода $? будет равна нулю.

Проверьте:

 $ var="something" $ [ -z "$var" ] $ echo $? 1 $ var="" $ [ -z "$var" ] $ echo $? 0 

Вы можете протестировать подключение к Интернету, вы можете использовать следующий лайнер:

 ping -s 1 -c 1 -W 2 -q www.google.com && echo "SUCCESS" || echo "FAILURE" 

С -s 1 мы отправим только 1 байт данных. С -c 1 мы отправим только один ICMP-пакет. С -W 2 мы указываем, что мы будем ждать только 2 секунды для ответа на пинг.