Как использовать не (!) В скобках в Bash? - PullRequest
6 голосов
/ 28 мая 2011

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 28 мая 2011

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

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

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

или

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

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

3 голосов
/ 28 мая 2011

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

if [ ! true ] || [ true ]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...