Bash scripting - выполнить и выполнить команду grep внутри скрипта - PullRequest
2 голосов
/ 28 октября 2009

Хорошо, я изучаю Баш, и вот это упражнение;

"Напишите скрипт, который каждые десять секунд проверяет, вошел ли пользователь 'user000'."

Моя идея состоит в том, чтобы grep a who, но я не знаю, как включить это в сценарий. Я пробовал такие вещи, как

if [ `who | grep "user000"` ] then things

но возвращает совпадающие строки с помощью grep, а не true / false.

Ответы [ 5 ]

7 голосов
/ 28 октября 2009

Вы хотите grep -q. Это «тихий режим»; просто устанавливает статус в зависимости от того, были ли совпадения, ничего не выводит. Итак:

if who | grep -q "user000"; then things; fi
3 голосов
/ 28 октября 2009

Вы можете сделать

who | grep "user000" > /dev/null  2>&1
# You can use "-q" option of grep instead of redirecting to /dev/null 
# if your grep support it. Mine does not.
if [ "$?" -eq "0" ]
then ...

Это использует $? - переменная Shell, в которой хранится код возврата / выхода последней команды, которая была выполнена. grep завершается с кодом возврата «0» в случае успеха и ненулевым при ошибке (например, строки не найдены, возвращает «1») - кстати, типичное расположение для команды Unix.

2 голосов
/ 28 октября 2009

Если вы тестируете код выхода канала или команды в if или while, вы можете оставить квадратные скобки и обратные кавычки (в любом случае вы должны использовать $() вместо обратных кавычек):

if who | grep "user000" > /dev/null 2>&1
then
  things-to-do
fi
1 голос
/ 28 октября 2009

Большинство ответов имеют правильную идею, но на самом деле вы хотите отбросить весь вывод из grep, включая ошибки. Кроме того, точка с запятой требуется после] для if:

if who | grep 'user000' >/dev/null 2>&1; then
    do things
fi

Если вы используете GNU grep, вы можете использовать опции -s и -q вместо:

if who | grep -sq 'user000'; then
    do things
fi

РЕДАКТИРОВАТЬ: опущенные скобки; если нужны только скобки для сравнения ops

0 голосов
/ 28 октября 2009

Возможно, это не самое элегантное заклинание, но я склонен использовать:

if [ `who | grep "user000" | wc -l` = "1" ]; then ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...