Bash 测试IF语句中的可选参数

Bash 测试IF语句中的可选参数,bash,Bash,在bash脚本中,我进行了此测试。这非常有效 function copy_to_server { if [ $1 -nt limit ]; then 现在我想允许第三个参数强制。但不管值是多少,测试通过: function copy_to_server { if [ $1 -nt limit ] || [ "$3"="-f" ] || [ "$3"="--force" ]; then 如何正确测试我的参数?您需要包括空格: if [ "$1" -nt limit ] || [ "$3

在bash脚本中,我进行了此测试。这非常有效

function copy_to_server {
  if [ $1 -nt limit ]; then
现在我想允许第三个参数强制。但不管值是多少,测试通过:

function copy_to_server {
  if [ $1 -nt limit ] || [ "$3"="-f" ] || [ "$3"="--force" ]; then

如何正确测试我的参数?

您需要包括空格:

if [ "$1" -nt limit ] || [ "$3" = "-f" ] || [ "$3" = "--force" ]; then
如果做不到这一点,shell将测试内部视为单个参数,并且根据规范,对于单个参数,如果参数不是空的,测试将返回“true”(0)

另外,请注意,我在第一个测试中引用了
$1
:如果传递了一个包含空格的参数,而不加引号,则会发生分词,shell将看到三个以上的参数,并出现语法错误(或者至少不执行您想要的操作)

如果您不介意Bash特定的语法,那么可以使用
[[]]
类型的测试,它不执行分词

if [[ $1 -nt limit ]] || [[ $3 = -f ]] || [[ $3 = --force ]]; then
但是,到那时,您可以将它们放在一个测试中,因为这种类型的测试还支持逻辑运算符:

if [[ $1 -nt limit || $3 = -f || $3 = --force ]; then

请注意,
=
=[[]]
测试中的code>运算符不执行globbing操作,因此,如果正在测试的字符串包含可能触发glob的内容(如*),则需要在右侧加引号。

空格。您忘记了
=
周围的空格。而且,
[“$3”=“-f”]| |[“$3”=“--force”]
可以简化为
[$3=~^(-f |--force)$]
,使用正则表达式运算符时,缺少@muru空格。不需要在
$1
中添加引号:最终用户无法直接访问这些参数。@mickro如果您认为调用上下文永远不会成为多字参数,那么它就可以工作;我倾向于避免这种假设,因为代码在某一点上倾向于重用,但这是一个偏好问题,所以不这样做在技术意义上并不是“错误的”。当然。你说得对。