Это должно работать:
if [ $testv = '!' ]; then
Здесь было несколько проблем:
$(...)
запускает команду и заменяет ее вывод; Вы хотите заменить значение переменной, поэтому используйте $var
или ${var}
.
- Понятия не имею, что там делал
#
. ${#var}
получит длину $ var, но это не то, что вам нужно.
- Команда
test
(для которой [
является синонимом) не понимает ==
, поэтому используйте =
(если вы программист на C, который будет выглядеть неправильно, но это оболочка, а не С).
- Я не думаю, что это проблема в скрипте, но для интерактивного ввода
"!"
не делает то, что вы ожидаете. Я использовал '!'
, чтобы убедиться, что восклицательный знак не может быть интерпретирован как опция истории.
В качестве альтернативы, вы можете использовать [[ ]]
вместо [ ]
, поскольку он понимает ==
(и в целом имеет более чистый синтаксис):
if [[ $testv == '!' ]]; then
Кстати, я верю из тега, что этот скрипт выполняется в zsh; в противном случае синтаксис будет немного другим (базовые оболочки не имеют [[ ]]
, и что-либо, кроме zsh, будет выполнять нежелательный анализ значения $ testv, если оно не заключено в двойные кавычки). Если вы не уверены (или хотите, чтобы он был переносимым), вот версия, которая должна работать в любой posix-совместимой оболочке:
if [ "$testv" = '!' ]; then