Ошибка получения команды не найдена при сравнении двух строк в Bash

Весь мой сценарий в настоящее время таков:

#!/bin/sh   
clear;   
blanko="";   
# Dummy-Variablen
variable=Testvariable;   
if [[$variable == $blanko]];
then   
  echo "Nichts da!"   
else   
  echo $variable   
fi

и если я войду

TestSelect.sh

я получил

/usr/bin/TestSelect.sh: line 6: [[Testvariable: command not found   
Testvariable

Как я могу это исправить?


person EpsilonAlpha    schedule 01.11.2013    source источник
comment
Совет на будущее: shellcheck автоматически укажет на эту и другие основные проблемы.   -  person that other guy    schedule 02.11.2013
comment
Спасибо, при всех моих поисках я не нашел этот сайт. :-)   -  person EpsilonAlpha    schedule 02.11.2013
comment
Еще один указатель: вам нужен завершающий оператор ; только в том случае, если вы помещаете несколько операторов в одну строку.   -  person mklement0    schedule 02.11.2013
comment
Вам нужны пробелы между [[ и $variable и $blanko и ]]   -  person Marcello Romani    schedule 20.01.2019


Ответы (4)


Это проблема:

if [[$variable == $blanko]];

Пробелы обязательны внутри квадратных скобок, используйте их так:

[[ "$variable" == "$blanko" ]] && echo "Nichts da!" || echo "$variable"
person anubhava    schedule 01.11.2013
comment
Большое спасибо. В Германии есть поговорка: я не вижу леса, потому что деревья - person EpsilonAlpha; 01.11.2013
comment
Обратите внимание, однако, что нет необходимости заключать ссылки на переменные в двойные кавычки (даже если значения содержат пробелы). - person mklement0; 02.11.2013
comment
@ mklement0: Просто для хорошей практики я всегда цитирую их, возможно, они не всегда нужны. - person anubhava; 02.11.2013
comment
@mklement0 оригинал, это была тестовая переменная, потому что я не знал точно, правильно ли я описал пустую строку, если честно. - person EpsilonAlpha; 02.11.2013
comment
@anubhava: Безусловно, безопасный подход - нелегко запомнить, когда происходит расширение оболочки; если есть сомнения, man bash описывает их (необходимо немного покопаться). - person mklement0; 02.11.2013
comment
@EpsilonAlpha: в английском есть такая же поговорка: [я] не вижу леса за деревьями. - person mklement0; 02.11.2013
comment
@mklement0: Спасибо, очень правильно выразился. Цитирование в большинстве случаев будет безопасным. - person anubhava; 02.11.2013
comment
но зачем вообще нужны такие пространства? - person quantum231; 20.05.2021
comment
@quantum231: это синтаксис bash - person anubhava; 20.05.2021
comment
хорошо, но почему мы получаем ошибку «команда не найдена» вместо синтаксической ошибки? - person quantum231; 20.05.2021
comment
Потому что bash интерпретирует это как команду при отсутствии правильного синтаксиса. - person anubhava; 20.05.2021

Кстати, вокруг [ ] также требуются пробелы:

if [ "$variable" = "$blanko" ]; then
  # more code here
fi

Обратите внимание, что переменные должны быть заключены в двойные кавычки внутри [ ], чтобы предотвратить разделение слов и подстановку. Двойные кавычки также помогают, когда какая-либо из сравниваемых переменных не установлена ​​- в противном случае оболочка выдаст синтаксическую ошибку.

Посмотрите следующий пост, чтобы понять, зачем нужны пробелы вокруг [ ]:

Другой связанный пост, в котором рассказывается о других элементах синтаксиса, которым также нужны пробелы:

Наконец, в этом посте рассказывается о разнице между [[ ]] и [ ]:


Связанный:

person codeforester    schedule 02.11.2017

Просто используйте #!/bin/bash поверх скрипта, если вы используете сценарии bash, такие как: if [[ $partition == "/dev/sda2" ]]; then для сравнения строки и запуска скрипта с ./scriptname.sh или bash scriptname.sh

person ankit    schedule 26.07.2019

Если ваш скрипт работает на вашем локальном компьютере с /bin/bash, но не на вашем контейнере с sh, рассмотрите возможность добавления bash в ваш контейнер с помощью apk add --no-cache bash.

person Danny    schedule 12.05.2020