bashshell中的多个条件

bashshell中的多个条件,bash,Bash,我在Bash中有这段代码, 目标是比较两个文件,如果文件匹配并且没有传递force参数,则退出。 另一方面,它应该继续下去 但是当我在没有参数的情况下运行并且脚本没有按预期停止时,我得到了这个错误, 当我通过force参数时,它工作正常。 有什么想法吗 if cmp -s file1 file2 && [ $1 != "-f" ] ; then "do something" exit 1 else "do som

我在Bash中有这段代码, 目标是比较两个文件,如果文件匹配并且没有传递force参数,则退出。 另一方面,它应该继续下去

但是当我在没有参数的情况下运行并且脚本没有按预期停止时,我得到了这个错误, 当我通过force参数时,它工作正常。 有什么想法吗

if    cmp -s  file1  file2  &&  [ $1 != "-f" ] ;  then 
"do something"
exit 1
else "do something"
fi

[…]
只是一个普通的命令,本质上相当于
测试
。因此,如果您传递了一个不带引号的空变量(比如
$1
,当没有参数提供给您的程序时),它将尝试运行
[!=“-f”]
,这会产生错误,因为您需要两个方面来与
!=
进行比较

要解决此问题,您可以使用
[[…]]
(需要
bash
,不兼容POSIX),这不会使不带引号的变量“消失”,也可以引用变量以保持POSIX兼容:

cmp -s file1 file2 && [[ $1 != "-f" ]]
cmp -s file1 file2 && [ "$1" != "-f" ]

[…]
只是一个普通的命令,本质上相当于
测试
。因此,如果您传递了一个不带引号的空变量(比如
$1
,当没有参数提供给您的程序时),它将尝试运行
[!=“-f”]
,这会产生错误,因为您需要两个方面来与
!=
进行比较

要解决此问题,您可以使用
[[…]]
(需要
bash
,不兼容POSIX),这不会使不带引号的变量“消失”,也可以引用变量以保持POSIX兼容:

cmp -s file1 file2 && [[ $1 != "-f" ]]
cmp -s file1 file2 && [ "$1" != "-f" ]

最有可能的是
$1
是空的。当我使用
[$1!=“-f”]]
时,使用
[…]]
而不是
[…]
,然后我得到了这个错误
[:找不到
如果你得到了错误
[:找不到
你一定没有使用bash,那么,你是如何运行脚本的?你的文件有一个shebang吗(第一行以
#!
开头)?如果是,它是否指定
bash
sh
?@Andrew
$SHELL
是您的用户帐户的默认交互式SHELL,不控制脚本的运行方式。shebang(
#!
)是什么SHELL行指定?如果您没有shebang,大多数shell和库函数将使用
sh
调用脚本。例外情况是bash,它使用
bash
调用此类脚本。自动警告有关引用问题。很可能
$1
为空。请使用
[…]
而不是
[…]
当我使用
[$1!=“-f”]
时,我得到了这个错误
[[:找不到
如果你得到了错误
[[:找不到
你一定没有使用bash,那么,你是如何运行脚本的?你的文件是否有一个shebang(第一行以
#!
开头)?如果是,它是否指定
bash
sh
?@Andrew
$SHELL
是您的用户帐户的默认交互式SHELL,并且不控制脚本的运行方式。shebang(
#!
)使用的SHELL是什么行指定?如果您没有shebang,大多数shell和库函数将使用
sh
调用脚本。例外是bash,它使用
bash
调用此类脚本。自动警告有关引用问题。谢谢,这第二个选项适用于我。谢谢,这第二个选项适用于我。