在Bash中比较两个字符串时出现“command not found”错误

106

我的整个代码如下:

#!/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

我该如何修复这个问题?


17
未来的提示:shellcheck 可以自动指出这个问题和其他基本问题。 - that other guy
2
另一个指针:只有在将多个语句放在一行上时才需要语句终止符; - mklement0
2
你需要在 [[$variable 以及 $blanko]] 之间加上空格。 - Marcello Romani
另一个问题是关于在Unix中使用的外部实用程序 [,但这是不同的问题。 - anubhava
请仔细检查,确保您使用的是普通空格而不是不间断空格。我经常会将非间断空格(nbsp)误输入为普通空格,导致出现难以理解和调试的错误。 - odinho - Velmont
4个回答

236

这是问题:

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

在方括号内需要加上空格,用法如下:

[[ "$variable" == "$blanko" ]] && echo "Nichts da!" || echo "$variable"

2
请注意,无论变量值是否包含空格,都不需要对变量引用进行双引号括起来。 - mklement0
2
@mklement0:只是为了好的实践,我总是引用它们,可能并不总是必要的。 - anubhava
3
@EpsilonAlpha:英语中也有类似的说法:“看树不见林”。 - mklement0
1
但是为什么我们需要在第一次这样做时留出空格呢? - quantum231
2
由于缺少正确的语法,bash会将其解释为命令。 - anubhava
显示剩余6条评论

37

另外,空格也是必需的,放在[ ]的周围:

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

请注意,变量必须用双引号括起来放在[ ]内,以防止单词分割和通配符。当要比较的变量之一未设置时,双引号也有助于避免Shell抛出语法错误。
请查看以下文章,了解为什么我们需要在[ ]周围使用空格:
另一个相关的帖子,谈论需要空格的其他语法元素:
最后,这篇文章讨论了[[ ]][ ]之间的区别:

相关内容:


0
如果您正在使用Bash脚本编写,只需在脚本顶部使用#!/bin/bash,例如:if [[ $partition == "/dev/sda2" ]]; then,以比较字符串并使用./scriptname.shbash scriptname.sh运行脚本。

-1
如果你的脚本在本地运行时使用了 /bin/bash,但是在容器中却用 sh 无法运行,那么考虑通过 apk add --no-cache bash 向容器中添加 bash。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接