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

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

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

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

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

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

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

  • Почему мой скрипт не выполняется на if.up
  • Почему тире расширяется \\\\ по-разному до bash?
  • Печать последнего символа в указанном пути
  • Вопрос Unix для файла формата даты
  • перебирать два списка переменных и назначать соответствующий порядок командам
  • как использовать syslog, чтобы избежать искажения файла журнала, когда несколько процессов просматривают один и тот же файл журнала?
  • Как проверить процесс вместе с его аргументами в списке процессов?
  • Возможно ли эхо в файл, но использовать отступы в источнике сценария оболочки?
  • 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 
    Interesting Posts

    Как отправить вывод ffmpeg в framebuffer?

    Невозможно обработать stdout с помощью трубы

    Как запустить собственный «pacman» на смонтированном изображении?

    Есть ли простой способ создать оболочку sudo?

    Значение пересечения границ файловой системы, – однофайловая система и т. Д.

    Перенос файлов с помощью ssh

    создать машину в реальном времени, назначив ядра ЦП критически важным процессам

    бесконечное активирующее состояние для пользовательской сборки openssh-hpn-sshd на ubuntu 16

    Список пользователей и групп пользователей в Raspbian

    Переименуйте файл со странным именем на Samba mount

    Как сделать остановку обслуживания одновременно?

    Nmcli отличается от Linux Mint 17, чем Ubuntu 16.04

    Linux brouting с ebtables, фильтрацией и форматированием EAPoL кадров

    Как ACL вычисляет эффективные разрешения для файла?

    Как изменить столбец в строке в текстовом файле с разделителями табуляции, если он дублируется

    Linux и Unix - лучшая ОС в мире.