Команды (например, grep
) обычно возвращают два разных вида результатов: вывод (то, что они печатают во время работы) и состояние выхода (лучше всего считать успехом или неудачей). Как указали цыплята, конструкция оболочки $(somecommand)
захватывает выходные данные команды, а не ее состояние выхода; но опция grep
от -q
позволяет выводить данные, поэтому $( )
ничего не захватывает.
Я вижу два простых способа исправить это (при условии, что я понимаю, что вы пытаетесь сделать). Первый - использовать grep -c
вместо -q
, чтобы он выводил количество найденных совпадений, и вы можете зафиксировать это с помощью $( )
и сравнить с 0, точно так же, как вы делаете (хотя я обернул строки для удобства чтения). ):
if [[ $(grep -c 10.212.5.5 /etc/dhcp/dhcpd.conf) == 0 ]] &&
[[ $(grep -c 10.212.5.15 /etc/dhcp/dhcpd.conf) == 0 ]] &&
[[ $(grep -c 10.212.5.5 file1) == 0 ]] &&
[[ $(grep -c 10.212.5.5 file2) == 0 ]] ; then
echo "notfound"
fi
Другой вариант - использовать grep -q
, но посмотрите на его статус выхода. Проверка состояния выхода команды в if
тривиальности - просто используйте саму команду в качестве условия проверки. Но в этом случае все наоборот, поскольку grep
возвращает успех, если шаблон был найден, и сбой, если его не было; Вы хотите, чтобы тест прошел успешно, если он не был найден, так что используйте !
чтобы изменить статус:
if ! grep -q 10.212.5.5 /etc/dhcp/dhcpd.conf &&
! grep -q 10.212.5.15 /etc/dhcp/dhcpd.conf &&
! grep -q 10.212.5.5 file1 &&
! grep -q 10.212.5.5 file2 ; then
echo "notfound"
fi