Сравните строковый литерал Bash с локальной переменной

#!/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 script, который сравнивает переменную с строковым литералом, и я использую [$lang == "Java"] (как показано выше), чтобы сравнить значение lang с "Java". Однако при этом сравнении возникает следующая ошибка:

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

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

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

Ответ 1

Вам нужны пробелы вокруг [ и ]:

    if [ "$lang" = "Java" ]

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

if [[ $lang == Java ]]