Як зробити оператор 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себе, який поверне помилковий (1), якщо не було збігу, а true (0), якщо такий був, не використовуючи [команду.

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

Перенаправлення на / dev / null - це також для запобігання друку знайденої лінії на екрані.


12
Зверніть увагу на -qопцію grep замість перенаправлення на / dev / null. З -q, grep нічого не виводить і припиняє пошук після першого матчу.
Stéphane Chazelas

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.