如何让 Bash 将变量解释为字符串进行比较?



>我有一个bash脚本,用于存储文件比较的输出。变量变成这样:thing="/path/to/file - differ:byte 2,line 3"。

在后面的行中,我想检查该东西是否为空。但是,当我尝试比较它们时,它将事物解释为命令,而不仅仅是字符串。

我的代码如下:

#!/bin/bash
thing="/path/to/file - differ: byte 2, line 3"
if ["$thing" != ""]; then
echo
echo "Something went wrong"
else
echo "Everything worked"
fi

我不是说事物不是空字符串,而是收到一条错误消息,说类似

bash: [/path/to/thing - differs: byte2, line 3: No such file or directory.

如何确保字符串之间发生了比较,并且该内容不会被解释为命令?

试试这个:

#!/bin/bash
thing="/path/to/file - differ: byte 2, line 3"
if [[ -n "$thing" ]]; then
echo "Something went wrong"
else
echo "Everything worked"
fi

请注意双[[]]对。这将利用Bash的内部test

使用 Bash 命令提示符上的help test获取更多信息。

编辑:正如Jonathan在评论中所解释的那样,使用任何[ … ][[ … ]]test都会使用Bash中的内置内部命令。man bash的第CONDITIONAL EXPRESSIONS节(或条件表达式、条件构造和 Bourne Shell 内置(对此进行了解释。 然而,虽然[ … ]test在逻辑上是相同的(唯一的区别是[期望它的最后一个参数是],但test没有类似的期望(,[[ … ]]实现的测试受制于不同的解析规则,[ … ]test,并且[[ … ]]实现了一些其他缺少的额外测试功能。