Использование grep -q в условии if

Подскажите как правильно использовать следующую конструкцию:

if [[ $(grep -q "192.168.0.100" /proc/mounts) -ne 0 ]] ; then
echo "Error"
fi

В таком варианте от скрипта полная тишина. Если я уберу одну пару квадратных скобок, то получу ошибку "ожидается унарный оператор"

Проверка grep'ом не из скрипта проходит успешно:

grep -q "192.168.0.100" /proc/mounts; echo $?
0
umount /mnt
grep -q "192.168.0.100" /proc/mounts; echo $?
1

Ответы (1 шт):

Автор решения: Pak Uula

Между if и ; then находятся команды, которые bash исполняет последовательно. Возвращаемое значение последней из программ в этом списке проверяется на равенство 0: если да, то выполняется ветка then, иначе ветка else.

Скобочки, которые обычно ставят в скриптах, это тоже программы (почти):

  • одинарную квадратную скобку [ баш ищет в PATH, и обычно это /usr/bin/[. Исходный код одинарной скобки:

    #define LBRACKET 1
    #include "test.c"
    

    То есть по факту [ есть синоним программы /usr/bin/test.

  • двойная квадратная скобка - это встроенная команда bash. Это не часть синтаксиса if, эту команду можно запускать без if. Например, можно запустить вот так: [[ "a" == "b" ]] ; echo $? - напечатает 1

Так вот, к чему я. Чтобы узнать, успешно отработал grep или нет, не нужно его ни с чем сравнивать. Достаточно просто поставить эту команду условием для if. Если grep находит что-то, он возвращает 0, иначе 1.

if grep -q "192.168.0.100" /proc/mounts; then
  echo yes
else
  echo no
fi

Более того, между if и grep можно добавить ещё команды. Bash их выполнит, а ветвиться будет по последней команде:

if  echo -n "Checking mount table: "; 
    grep -q "192.168.0.100" /proc/mounts; 
then
  echo yes
else
  echo no
fi

У меня этот скрипт печатает Checking mount table: no

→ Ссылка