我正在写一个 shell 脚本,我正在做
if ["$item0" == "$item1"]
then
echo match
fi
但它在运行时给出错误消息“没有这样的文件或目录”。如果有帮助,上面的项目确实包含文件路径。
我正在写一个 shell 脚本,我正在做
if ["$item0" == "$item1"]
then
echo match
fi
但它在运行时给出错误消息“没有这样的文件或目录”。如果有帮助,上面的项目确实包含文件路径。
您需要注意变量和括号之间的空格,它们很重要。此外,如果then与 位于同一行if,则需要一个;
更正的语法:
if [ "$item0" == "$item1" ]; then
echo match
fi
PS如果match应该是一个变量,请确保它是echo "$match"
首先,在此处发布时,您可能应该始终提供完整的错误消息,可能会删除任何敏感数据。
让我们首先解释一下您的线路是如何出错的:
在 bash 中,[基本上是 的同义词test,但有一些细微差别(最明显的是它希望最后一个参数是])。运行man test以获取更多信息。test接受具有自己语法的东西,然后根据其输入评估为真或假返回适当的值。因此,由于test它是一个程序,而不是 bash 内置,它必须将其输入作为单独的参数(注意空格):
[ "$item0" = "$item1" ]
The =instead of the==是一种风格偏好。它们做同样的事情,但=由于 bash 不是 C 语言,因此有些人更喜欢它们。
其次,bash 需要知道外部命令的输入何时结束。这是用;. 为了更清楚,假设我这样做
if true then echo foo fi fi
现在我正在尝试打印foo fiif 语句的计算结果是否为真。看到我的问题了吗?Bash 不知道何时终止对 echo 命令的输入。
正确重写:
if [ "$item0" = "$item1" ]; then echo match; fi
对于它的价值,如果您使用的是 bash,它比(除非您真的需要可移植性,一段时间以来一直是首选的 bash 习惯用法)[[更容易使用和更可靠。一方面,不必用 引用参数扩展,也不必担心空字符串。它还具有模式匹配(with )和正则表达式匹配(with )。[[[[[===~