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

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

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

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

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

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

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

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 
  • обрабатывать большое количество журналов с помощью cron или logrotate
  • Команда nvm недоступна в скрипте bash
  • Сценарий оболочки Bash для поиска и удаления подстроки в имени файла
  • Заменить значения в файле
  • Расширение параметра Shell
  • По умолчанию «Выполнить» при двойном щелчке по сценарию оболочки в PCManFM
  • Возможно ли создать липкое перенаправление из stdout / stderr
  • как автоматически подключиться к сохраненному списку сетей
  • Удалите все повторяющиеся слова из строки, используя сценарий оболочки
  • Сценарий Bash не может найти модуль perl
  • распаковать вложенные .zip-файлы по сценарию оболочки
  • Удаление следующего-последнего расширения в имени файла
  • Linux и Unix - лучшая ОС в мире.