Проблема здесь в том, что [
- это простая команда 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
здесь.)