Как использовать not (!) в круглых скобках в Bash?

#bash #if-statement

#bash #if-оператор

Вопрос:

Я хочу сделать что-то вроде этого:

 if [ (! true) -o true ]
then
    echo "Success!"
else
    echo "Fail!"
fi
  

Но это выдает ошибку ( -bash: syntax error near unexpected token '!' )

Возможно ли сделать что-нибудь подобное?

Ответ №1:

Проблема здесь в том, что [ это простая команда сборки в bash (другой способ записи test ), которая может интерпретировать только те параметры, которые она получает, в то время как ( является символом оператора. Синтаксический анализ операторов происходит перед выполнением команды.

Чтобы использовать ( и ) с [ , вы должны заключить их в кавычки:

 if [ ( ! true ) -o true ]
then
    echo "Success!"
else
    echo "Fail!"
fi
  

или

 if [ '(' ! true ')' -o true ]
then
    echo "Success!"
else
    echo "Fail!"
fi
  

[[ ... ]] Конструкция — это специальная синтаксическая конструкция, которая не имеет синтаксических ограничений обычных команд, поскольку она работает на другом уровне. Таким образом, здесь вам не нужно заключать скобки в кавычки, как сказал Игнасио. (Кроме того, здесь вы должны использовать amp;amp; and || вместо -a и -o .)

Ответ №2:

Вы не можете этого сделать, но вы можете сделать это:

 if [ ! true ] || [ true ]
  

Как общее правило, никогда не пытайтесь использовать опции -a или -o для [ .