Команды (например, 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