1

我正在写一个 shell 脚本,我正在做

if ["$item0" == "$item1"]
then
echo match
fi

但它在运行时给出错误消息“没有这样的文件或目录”。如果有帮助,上面的项目确实包含文件路径。

4

3 回答 3

6

您需要注意变量和括号之间的空格,它们很重要。此外,如果then与 位于同一行if,则需要一个;

更正的语法:

if [ "$item0" == "$item1" ]; then
    echo match
fi

PS如果match应该是一个变量,请确保它是echo "$match"

于 2012-10-30T16:57:39.103 回答
3

首先,在此处发布时,您可能应该始终提供完整的错误消息,可能会删除任何敏感数据。

让我们首先解释一下您的线路是如何出错的:

  1. 在 bash 中,[基本上是 的同义词test,但有一些细微差别(最明显的是它希望最后一个参数是])。运行man test以获取更多信息。test接受具有自己语法的东西,然后根据其输入评估为真或假返回适当的值。因此,由于test它是一个程序,而不是 bash 内置,它必须将其输入作为单独的参数(注意空格):

    [ "$item0" = "$item1" ]

    The =instead of the==是一种风格偏好。它们做同样的事情,但=由于 bash 不是 C 语言,因此有些人更喜欢它们。

  2. 其次,bash 需要知道外部命令的输入何时结束。这是用;. 为了更清楚,假设我这样做

    if true then echo foo fi fi

    现在我正在尝试打印foo fiif 语句的计算结果是否为真。看到我的问题了吗?Bash 不知道何时终止对 echo 命令的输入。

正确重写:

if [ "$item0" = "$item1" ]; then echo match; fi
于 2012-10-30T17:11:32.170 回答
1

对于它的价值,如果您使用的是 bash,它比(除非您真的需要可移植性,一段时间以来一直是首选的 bash 习惯用法)[[更容易使用和更可靠。一方面,不必用 引用参数扩展,也不必担心空字符串。它还具有模式匹配(with )和正则表达式匹配(with )。[[[[[===~

于 2012-10-30T19:31:53.173 回答