Я попытался установить условное выражение в сценарии bash, но я столкнулся с необычной ошибкой; Баш жалуется на слишком много аргументов, но все кажется правильным для меня:Восклицательный знак и слишком много аргументов
[ "${foo:0:1}" = '!' -o "$foo" = '*' ]
Проще говоря, тест должен добиться успеха, если $foo
либо звездочка, или начинается с восклицательным знаком.
Однако, когда $foo
начинается с восклицательным знаком, я получаю следующее сообщение об ошибке в Баш:
bash: [: too many arguments
Странная вещь является то, что она отлично работает, если я опустить второе условие так:
[ "${foo:0:1}" = '!' ]
Итак, кажется, что оценка восклицательного знака как-то мешает логике или условию, может ли кто-нибудь объяснить, что здесь происходит, и как наилучшим образом будет работать вокруг него?
Это, кажется, не имеет значения, что я тестирую для, например:
[ "${foo:0:1}" = 'z' -o "$foo" = '*' ]
Будет ли еще потерпеть неудачу, если $foo
начинается с восклицательным знаком. Это меня беспокоит, так как у меня есть множество сценариев, которые проверяют символы таким же образом, что, предположительно, неожиданно может произойти неожиданно, если значение содержит восклицательный знак, поэтому я мог бы найти подходящее обходное решение для этого.
Я предполагаю, что вы используете скрипт с 'sh' вместо' bash', что означает, что вы не можете использовать расширения Bash, такие как '-o'. – tripleee