将null值与字符串进行比较时,在shell脚本中需要一元运算符

时间:2013-03-22 15:08:56

标签: shell

我有两个变量

var=""
var1=abcd

这是我的shell脚本代码

if [ $var == $var1 ]; then
  do something
else
  do something
fi

如果我运行此代码,则会提示警告

[: ==: unary operator expected

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:81)

由于$var的值是空字符串,因此:

if [ $var == $var1 ]; then

扩展到:

if [ == abcd ]; then

这是语法错误。

您需要引用参数:

if [ "$var" == "$var1" ]; then

您也可以使用=而不是==;这是原始语法,而且更便于携带。

如果您使用的是bash,则可以使用[[语法,该语法不需要引号:

if [[ $var = $var1 ]]; then

即使这样,引用变量引用并添加引号也不会有害:

if [[ "$var" = "$var1" ]]; then

可能会为将来的读者节省一些时间,以便记住[[ ... ]]是否需要它们。

答案 1 :(得分:0)

为什么所有人都想使用' =='而不是简单的' =' ?这是坏习惯!它仅用于[[]]表达式。而在(())也是如此。但你也可以使用=!无论如何它都运作良好。如果你使用数字,不是字符串使用不是parcing到字符串然后比较相似的字符串,但比较数字。像那样

let -i i=5 # garantee that i is nubmber
test $i -eq 5 && echo "$i is equal 5" || echo "$i not equal 5"

它的匹配更好,更快。我是C / C ++,Java,JavaScript方面的专家。但如果我使用bash,我永远不会使用' =='相反' ='。你为什么这样做?