Множественный оператор, который включает специальные символы, используя при возникновении ошибок

Я пытаюсь написать сценарий, который будет проверять, не определен ли конкретный контент в определенных файлах / папках, тогда он должен напечатать сообщение «failed». иначе он должен печатать «успех». Однако следующий сценарий вызывает несколько ошибок.

if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]] then echo "Failed" else echo "Passed" fi 

Может ли кто-нибудь сказать мне, почему он вызывает ошибки, и есть ли способ устранить ошибки и получить ожидаемый результат?

ОБНОВЛЕНИЕ: я получаю следующие ошибки:

 s.sh: line 1: conditional binary operator expected s.sh: line 1: expected `)' s.sh: line 1: syntax error near `'/example.com'' s.sh: line 1: `if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]' 

4 Solutions collect form web for “Множественный оператор, который включает специальные символы, используя при возникновении ошибок”

Прямой путь:

 grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data if [ $? -eq 0 ]; then # check exit status echo "Passed" else echo "Failed" fi 

  • Параметр -q указывает, что ничего не пишет для стандартного вывода. Выйдите немедленно с нулевым статусом 0 если найдено совпадение, даже если обнаружена ошибка.

  • $? – содержит код статуса выхода последнего запуска команды


Вышеупомянутое может быть также упрощено:

 if grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data; then echo "Passed" else echo "Failed" fi 

[[...]] – это конструкция, используемая для выполнения сравнений и других видов тестов. Это команда ksh , синтаксический анализ которой соответствует специальным синтаксическим правилам и заменяет стандартную команду (с обычным простым синтаксическим разбором команд).

Здесь это бесполезно. Будет ли grep команда grep успешной, которую вы хотите протестировать (а не [[...]] или [ команда), так что это просто:

 if grep -qF /example.com /opt/nfs || grep -RqF /example.com /data then echo passed else echo failed fi 

-q подавляет выход, а также оптимизирует, выйдя, как только будет найдено одно совпадение, а не пытается найти все совпадения.

Вот возможное упрощение вашего решения:

  • Прежде всего, если вы используете GNU grep , он может выполнять поиск в нескольких файлах |, предоставленных в строке аргументов. Поэтому в принципе нет необходимости запускать две команды grep для поиска одного и того же шаблона в двух разных папках: grep '/example.com' /opt/nfs /data выполняет задание на поиск места /example.com в этих двух папках.
  • Второе два отрицания равны положительному. Так почему бы просто не использовать этот код: if grep -rq "/example.com" /opt/nfs /data ; then echo "success" ; else echo "failed" ; fi if grep -rq "/example.com" /opt/nfs /data ; then echo "success" ; else echo "failed" ; fi if grep -rq "/example.com" /opt/nfs /data ; then echo "success" ; else echo "failed" ; fi grep будет успешным, если он обнаружит появление «/example.com» либо в /opt/nfs либо в /data

Это будет быстрее и эффективнее, только один grep генерируется из оболочки.

Попробуйте вот так:

 if [[ ! $(grep '/example.com' /opt/nfs &>/dev/null) || ! $(grep -R '/example.com' /data &>/dev/null) ]] then echo "Failed" else echo "Passed" fi 

Но я думаю, что ваш скрипт не имеет смысла, потому что вы подавляете stdout и stderr с помощью &>/dev/null . Вывод команды grep всегда будет пустым. Замените & до 2 чтобы подавить только stderr .

  • awk системный вызов с инвертированным эффектом
  • Как сделать вывод для grep неудачным?
  • Как узнать, существует ли каталог?
  • Правильное литье типов в сценарии оболочки для использования с циклом while и модулем
  • Как проверить, есть ли «другие» разрешения в домашних каталогах
  • Некоторые ошибки возникли, когда я установил lucene, модуль perl!
  • Модернизирован, чтобы проверить ветвь по ошибке в debian ... как я могу вернуться к стабильной?
  • Что означает '-size +0' в команде 'test'
  • Использование -n и -z в тестировании встроено - Bash
  • Linux и Unix - лучшая ОС в мире.