>我有一个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
,并且[[ … ]]
实现了一些其他缺少的额外测试功能。