Bash `if`命令中的相等性测试,返回错误消息“无此类文件或目录”

Bash `if`命令中的相等性测试,返回错误消息“无此类文件或目录”,bash,shell,if-statement,Bash,Shell,If Statement,我正在写一个shell脚本 if ["$item0" == "$item1"] then echo match fi 但它会在运行时给出错误消息,即行中没有这样的文件或目录。如果有帮助的话,上面的项目确实包含文件路径。您需要注意变量之间的空格和括号,它们很重要。如果then与if在同一条线上,那么您需要一个 更正语法: if [ "$item0" == "$item1" ]; then echo match fi 另外,如果match应该是一个变量,请确保它是echo$match您需

我正在写一个shell脚本

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

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

您需要注意变量之间的空格和括号,它们很重要。如果then与if在同一条线上,那么您需要一个

更正语法:

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

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

您需要注意变量之间的空格和括号,它们很重要。如果then与if在同一条线上,那么您需要一个

更正语法:

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

注意:如果match应该是一个变量,请确保它是echo$match

开始,在这里发布时,您可能应该始终给出完整的错误消息,可能会删除任何敏感数据

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

在bash中,[基本上是test的同义词,有一些细微的区别,最明显的区别是它希望它的最后一个参数是]。运行人工测试以获取更多信息。测试使用自己的语法接收内容,然后根据其输入的计算结果是true还是false返回正确的值。因此,由于测试是一个程序,而不是bash内置程序,它必须将其输入作为单独的参数。请注意空格:

[$item0=$item1]

=而不是==是一种风格偏好。它们做同样的事情,但是=是一些人的首选,因为bash不是C

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

如果为true,则回显foo-fi-fi

现在,如果if语句的计算结果为true,我将尝试打印出foo-fi。看到我的问题了吗?Bash不知道何时终止echo命令的输入

正确重写:

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

首先,在这里发布时,您可能应该始终给出完整的错误消息,可能会删除任何敏感数据

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

在bash中,[基本上是test的同义词,有一些细微的区别,最明显的区别是它希望它的最后一个参数是]。运行人工测试以获取更多信息。测试使用自己的语法接收内容,然后根据其输入的计算结果是true还是false返回正确的值。因此,由于测试是一个程序,而不是bash内置程序,它必须将其输入作为单独的参数。请注意空格:

[$item0=$item1]

=而不是==是一种风格偏好。它们做同样的事情,但是=是一些人的首选,因为bash不是C

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

如果为true,则回显foo-fi-fi

现在,如果if语句的计算结果为true,我将尝试打印出foo-fi。看到我的问题了吗?Bash不知道何时终止echo命令的输入

正确重写:

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

值得一提的是,如果您使用的是bash,[[比[除非您真的需要可移植性,[]更容易使用和更可靠,[[一直是首选的bash习惯用法。首先,不必引用参数扩展[[,您也不必担心空字符串。它还具有模式匹配==和正则表达式匹配=~。

如果您使用bash,[]比[除非您确实需要可移植性,]更易于使用和更可靠[[一段时间以来一直是bash的首选习惯用法。首先,不必引用参数扩展[[,而且你也不必担心空字符串。它还具有模式匹配==和正则表达式匹配=~。

请详细说明你到底想实现什么?请详细说明你到底想实现什么?同一行的内容只是我的格式,我想我已经修复了。括号周围的空格ets是个问题,我欠你一杯啤酒。对于后面的人来说,这是因为[is]是一个名为[.Sh的程序,程序名周围需要空格,这就导致了这个问题。同样的一行内容就是我的格式,我想我已经解决了。括号周围的空格是个问题,我欠你一杯啤酒。对于后面的人来说,这是因为[是一个名为[.Sh在程序名周围需要空格,这就导致了这个问题。=而不是==不仅仅是一种风格偏好:前者是POSIX,而不是后者,因此一些shell可能无法正确解释它,例如dash,对于这种迂腐的评论总是很方便;-。当然,如果您知道您的脚本总是由bash,那么两者确实是等价的。test已经是bash内置代码有相当一段时间了。Woops,我应该说test既是一个程序,也是一个具有非常相似语法和行为的bash内置代码。谢谢你的更正,Virgil
e、 =而不是==不仅仅是一种风格偏好:前者是POSIX,而不是后者,因此一些shell可能无法正确解释它,例如dash,它对于这种迂腐的评论总是很方便;-。当然,如果您知道脚本总是由bash解释的,那么两者确实是等价的。test是bash内置的已经有相当一段时间了。哇,我应该说test既是一个程序,也是一个语法和行为非常相似的bash内置的。感谢您的更正,Virgile.[是posix所必需的。如果bash要成为一个兼容的shell,则不能弃用它。@Williampersell:posix本身不推荐posix所需的echo等功能。但是posix只保留[[],因此它的使用不可移植。因此,不推荐的功能可能太强大,这是公平的。[是posix所必需的。如果bash要成为兼容的shell,则不能弃用它。@Williampersell:posix本身不推荐posix所需的echo等功能。但posix只保留[],因此它的使用不可移植。因此,不推荐的功能可能太强大,这是公平的。