Логический И в сценарии bash

У меня есть if в моем скрипте bash, который должен проверить, существует ли EITHER из двух файлов, если они не существуют, он должен соответствовать эхо.

У меня есть код:

 if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Но по какой-то причине это не работает.

Я на 110% уверен, что этих двух файлов не существует. Я не получаю никаких ошибок, он просто не вводит if .

Я новичок в написании сценариев bash, поэтому я не уверен, что может быть неправильным.

  • Как я могу проверить RUNLEVEL из сценария bash на Rasbpian?
  • Как вставить строку в массив по-разному
  • Как сделать скрипт для запуска приложений в течение 1 секунды?
  • Скрипт должен читать эхо-строку
  • Почему в этом сценарии оболочки bourne выполняется `exec 2> & 1`?
  • Как назначить значения матрицы переменным в bash
  • Udev: запуск shellscript, который обращается к X-дисплею
  • Как я могу назначить начальный / стандартный пароль для пользователя в Linux?
  • 4 Solutions collect form web for “Логический И в сценарии bash”

    Если вы хотите, то вы хотите OR , а не И.

     if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
    • Это будет соответствовать отсутствию одного или обоих файлов.
    • Ваш код будет печатать только в том случае, если они не существуют.

    Но вы сказали:

    Я на 110% уверен, что этих двух файлов не существует. Я не получаю никаких ошибок, он просто не вводит if.

    Таким образом, ваше утверждение противоречит самому себе. По крайней мере, один из этих файлов должен существовать, если вы используете этот код.

    Если вы хотите посмотреть, как оценивается ваш оператор if , запустите его с -x .

     #!/bin/bash -x if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

    Затем вы увидите выполнение.

     $ ./test.sh + [[ ! -f /etc/benchmarking/code ]] + [[ ! -f /etc/benchmarking/code.class ]] + echo match match $ 

    Разве это не должно быть так? A является файлом или B является файлом, а затем blabla.

     if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; then echo "match" fi 

    Это может также работать на то, что вы пытаетесь сделать. Единичные скобки сегодня не используются сегодня с bash, но это все еще вариант. Использование «-o» фактически является «OR» и «!» отрицает условие.

     var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match" и var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match" 

    Ваш код удовлетворяет вашим требованиям: он будет печатать match при условии, что он не может найти ни один файл.

    Поэтому match причины не печатается в другом месте. Вы должны подтвердить, что кодовый блок достигнут, что вы можете сделать, окружив его паролем сообщения отладки. Например, например:

     echo '@ About to enter if...fi block' if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi echo '@ Finished if...fi block' 

    Обычно я предпочитаю отлаживать сообщения в stderr, чтобы избежать прерывания потока данных в stdout , но я избегал этого здесь, потому что вы сказали, что являетесь новичком. Вот один пример, показывающий, как вы можете писать в stdout :

     echo '@ About to enter if...fi block' >&2 
    Linux и Unix - лучшая ОС в мире.