Использование 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 шт):
Между 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