Как сделать оператор if из результата выполненной команды


54

Я пытаюсь сделать оператор IF из вывода выполненной команды. Вот как я пытаюсь это сделать, но это не работает. Кто-нибудь знает правильный способ сделать это?

if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then
  echo "Found a Tomcat!"
fi

Ответы:


65

Используйте [[условную конструкцию bash и предпочитайте соглашение о подстановке команд $(<command> ). Кроме того, [[предотвращает разбиение слов по значениям переменных, поэтому нет необходимости заключать бит подстановки в команду.

if [[ $(netstat -lnp | grep ':8080') = *java* ]]; then
  echo "Found a Tomcat!"
fi

30

Другой альтернативой является простое тестирование состояния выхода самого grepсебя, которое вернет false (1), если не было совпадения, и true (0), если оно было, без использования [команды.

if netstat -lntp | grep ':8080.*java' > /dev/null; then
    echo "Found a Tomcat!"
fi

Перенаправление на / dev / null не позволяет печатать найденную строку на экране.


12
Обратите внимание на -qопцию grep вместо перенаправления в / dev / null. С помощью -qgrep ничего не выводится и прекращает поиск после первого совпадения.
Стефан Шазелас

5

Еще проще,

netstat -lntp | grep ':8080.*java' > /dev/null && command

Если вы просто хотите сделать одну вещь.


4

Вы можете сделать более точное, но простое, сопоставление с awk.

if netstat -lnp | awk '$4 ~ /:8080$/ && $7 ~ /java/ {exit(0)} END {exit(1)}'; then 

Чтобы более точно соответствовать структуре вашей команды, переносимый способ сопоставления символов подстановки для строки в оболочке заключается в использовании caseконструкции.

case "$(netstat -lnp | grep ':8080')" in
  *java*)  echo "Found a Tomcat!";;
esac

0

Еще один пример из реальной жизни :)

if [[ $(HEAD mycompany-intranet.com | grep '200\ OK' | wc -l) = "1" ]];  then
    echo doing some intranet settings (proxy, etc)
else
    echo doing some work-at-home settings (proxy, etc)
fi

Что делает HEAD? Это пользовательская функция или псевдоним в вашей системе?
luckman212

usr/bin/HEAD → lwp-request, И lwp-запрос, кажется, вот этот . Не уверен, как я пришел к этому (не вручную, конечно), если это все там по умолчанию. Там , как представляется, в нижнем регистре , usr/bin/head а также .
Фрэнк Нок
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.