37

我有两个变量

var=""
var1=abcd

这是我的shell脚本代码

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

如果我运行此代码,它将提示警告

[: ==: unary operator expected

我该如何解决这个问题?

4

2 回答 2

110

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

if [ $var == $var1 ]; then

扩展为:

if [ == abcd ]; then

这是一个语法错误。

您需要引用参数:

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

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

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

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

即使这样,引用变量引用并添加引号也没有什么坏处:

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

可能会为未来的读者节省一点时间来记住是否[[……]]需要它们。

于 2013-03-22T15:13:26.017 回答
1

为什么所有人都想使用 '==' 而不是简单的 '=' ?这是坏习惯!它仅用于 [[ ]] 表达式。在 (( )) 中也是如此。但是你也可以使用=!它在任何情况下都能很好地工作。如果您使用数字,则不是字符串使用 not 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,我从不使用 '==' 而不是 '='。你为什么这样做?

于 2017-08-14T06:18:22.030 回答