比较空值和字符串时,shell脚本中需要一元运算符

比较空值和字符串时,shell脚本中需要一元运算符,shell,Shell,我有两个变量 var="" var1=abcd 这是我的shell脚本代码 if [ $var == $var1 ]; then do something else do something fi 如果我运行此代码,它将提示一个警告 [: ==: unary operator expected 如何解决此问题?由于$var的值是空字符串,因此: if [ $var == $var1 ]; then 扩展到: if [ == abcd ]; then 这是一个语法错误 您需要引用

我有两个变量

var=""
var1=abcd
这是我的shell脚本代码

if [ $var == $var1 ]; then
  do something
else
  do something
fi
如果我运行此代码,它将提示一个警告

[: ==: unary operator expected

如何解决此问题?

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

if [ $var == $var1 ]; then
扩展到:

if [ == abcd ]; then
这是一个语法错误

您需要引用以下参数:

if [ "$var" == "$var1" ]; then
您也可以使用
=
而不是
=
;这是最初的语法,而且更便于移植

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

if [[ $var = $var1 ]]; then
即使如此,引用变量引用并添加引号也没有什么坏处:

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

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

为什么所有人都想使用“==”而不是简单的“=”?这是个坏习惯!它只在[[]]表达式和(())中使用太好了。但是你也可以使用just=太好了!它在任何情况下都能很好地工作。如果你使用数字,而不是字符串,则使用不对字符串进行分组,然后比较like string,但比较数字。就像这样

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,我从不使用“==”而使用“=”。为什么这样做?

要在帖子中格式化代码,只需突出显示它并单击“{}”图标(或将其缩进4个空格)。您的代码标记为
(表示引用的文本,而不是格式化的代码)还有不必要的

标记。我修复了它。StackOverflow上还有许多其他问题,涉及在变量未设置或为空值的情况下引用变量的需要。提醒一下:要表示有答案解决了您的问题,您可以单击绿色箭头“接受”它。接受哪个答案,以及是否接受答案完全取决于您。相同的错误出现在大于或小于运算符上。如何作为数字比较来解决。如果[$var-gt$var1]嗯,在…为什么你这么做?中有比我更令人信服的论点。例如:。它告诉你,
==
=
的别名
=
是标准运算符,而
=
是广泛实现的,但它不是POSIX: