我正在写一个 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 fi
if 语句的计算结果是否为真。看到我的问题了吗?Bash 不知道何时终止对 echo 命令的输入。
正确重写:
if [ "$item0" = "$item1" ]; then echo match; fi
对于它的价值,如果您使用的是 bash,它比(除非您真的需要可移植性,一段时间以来一直是首选的 bash 习惯用法)[[
更容易使用和更可靠。一方面,不必用 引用参数扩展,也不必担心空字符串。它还具有模式匹配(with )和正则表达式匹配(with )。[
[[
[[
==
=~