2013-06-17 3 views
12
#!/bin/bash 
function getComment(){ 
    local lang=$1; 
    local theComment=$2; 
    if [$lang == "Java"] #Surprisingly, an error occurs here: prog.sh: line 6: [Java: command not found 
    then 
     echo "//"$theComment; return; 
    else 
     echo "Language not found!"; return; 
    fi 
} 

getComment "Java" "Whoo!"; 

exit $? 

Я пишу скрипт Bash, который сравнивает переменную строкового литерала, и я использую [$lang == "Java"] (как показано выше), чтобы сравнить значение lang к "Java" , Тем не менее, это сравнение дает следующее сообщение об ошибке:Сравните Баш строковый литерал локальной переменной

stderr: 
prog.sh: line 6: [Java: command not found 

Я попытался с помощью [$lang -eq "Java"] и ($lang -eq "Java"), а также, но эти заявления не работают либо, и они получают точно такую ​​же ошибку.

Почему возникает эта ошибка, и каков правильный способ сравнения локальной переменной с строковым литералом?

+0

Это не относится к вашему вопросу, но вам не нужны точки с запятой в конце строк в оболочке. Они нужны только в том случае, если вы помещаете несколько команд в одну строку. –

+0

Возможный дубликат [bash, command not found] (http://stackoverflow.com/questions/16694586/bash-command-not-found) – chepner

+1

Не лучший дубликат, но есть много вопросов о переполнении стека с тем же ответом : помещает пробелы в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – chepner

ответ

22

Вам нужно пространство вокруг [ и ]:

if [ "$lang" = "Java" ] 

[ является командой (это синоним test), и, как и любой другой команды можно разграничить параметры с пробелами.

Вы также должны поместить переменные в двойные кавычки, если значение пусто или содержит пробельные символы или подстановочные знаки.

Наконец, оператор для сравнения строк - =, хотя некоторые версии test позволяют использовать == в качестве расширения.

+0

Хороший ответ с контекстом –

1

Прежде всего, не используйте [] - это better использовать [[.

И второе - вам нужно добавить некоторые пробелы:

if [[ $lang == Java ]] 
+0

Оператор сравнения == работает по-разному в рамках теста с двумя скобками, чем в отдельных скобках. http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS –

2

Во-первых, вы должны заключить переменную между двойные кавычки, поскольку переменная может иметь некоторые пробелы или специальные символы.

Наконец, помните, что "[" это исполняемый файл сам по себе (обычно это/bin).

if [ "$lang" == "Java" ]; then