将Bash字符串文字与局部变量进行比较

将Bash字符串文字与局部变量进行比较,bash,Bash,我正在编写一个Bash脚本,将变量与字符串文本进行比较,并使用[$lang==“Java”](如上所示)将lang的值与的“Java”进行比较。但是,此比较会产生以下错误: #!/bin/bash function getComment(){ local lang=$1; local theComment=$2; if [$lang == "Java"] #Surprisingly, an error occurs here: prog.sh: line 6: [Java

我正在编写一个Bash脚本,将变量与字符串文本进行比较,并使用
[$lang==“Java”]
(如上所示)将
lang
的值与
的“Java”
进行比较。但是,此比较会产生以下错误:

#!/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 $?
我也尝试过使用
[$lang-eq“Java”]
($lang-eq“Java”)
,但这些语句也不起作用,它们产生了完全相同的错误


为什么会发生此错误?将局部变量与字符串文字进行比较的正确方法是什么?

您需要在
[
]
周围使用空格:

stderr:
prog.sh: line 6: [Java: command not found
[
是一个命令(它是
test
的同义词),与任何其他命令一样,您可以用空格分隔参数

如果值为空或包含空格或通配符,还应将变量置于双引号中


最后,执行字符串比较的操作符是
=
,尽管一些版本的
测试
允许
=
作为扩展。

第一件事是,不要使用[]-而是使用[]

第二,您需要添加一些空格:

    if [ "$lang" = "Java" ]

首先,必须将变量括在双引号之间,因为变量可能有一些空格或特殊字符

最后记住“[”本身就是一个可执行文件(通常在/bin中)


==比较运算符在双括号测试中的行为与在单括号测试中的行为不同。这与您的问题无关,但您不需要在shell中的行末尾使用分号。只有在单行上放置多个命令时才需要分号。可能的重复不是最佳的重复,但有许多问题在堆栈溢出时使用相同的答案:在
test
命令的
[
]
周围放置空格。
if [[ $lang == Java ]]
if [ "$lang" == "Java" ]; then