Bash参数扩展

Sda*_*ons 2 parameters bash shell expansion

我有一个使用以下逻辑的脚本:

if [ ! -z "$1" ]; then         # if any parameter is supplied
    ACTION=                    # clear $ACTION
else
    ACTION=echo                # otherwise, set it to 'echo'
fi
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作.但是,在阅读本手册的Shell参数扩展部分时bash,似乎应该可以在一个步骤中完成.但是,我无法完全理解如何做到这一点.

我试过了:

ACTION=${1:-echo}              # ends up with $1 in $ACTION

ACTION=${1:+}
ACTION=${ACTION:-echo}         # ends up always 'echo'
Run Code Online (Sandbox Code Playgroud)

还有几种嵌套方法,但据我所知,嵌套似乎是不允许的.

我意识到我已经有了一个有效的解决方案,但现在我真的很好奇,如果可能的话.对于三元运算符来说,它是直截了当的,但我不认为bash有一个.

如果这是可能的,我希望看到这样做的逻辑似乎是两步过程,没有if/else结构,但只使用Shell参数扩展功能的任意组合.

谢谢.


编辑 elderarthis:

脚本的其余部分只是:

find . -name "*\?[NMSD]=[AD]" -exec ${ACTION} rm -f "{}" +
Run Code Online (Sandbox Code Playgroud)

我只想ACTION=echo对自己进行一次健全检查,因此,传递任何参数都会实际删除(通过使$ {ACTION}无效,而传递没有args会在那里留下回声.

我知道TIMTOWTDI; 我想看看它是否只能通过Shell参数扩展部分中的内容来完成:-)


编辑 Mikel:

$ cat honk.sh
#!/bin/bash
ACTION=${1-echo}
echo $ACTION
$ ./honk.sh
echo
$ ./honk.sh foo
foo
Run Code Online (Sandbox Code Playgroud)

最后需要有ACTION='',因此返回一个空行/空值.

Jon*_*ler 6

如果我坚持用少于4行并且没有子shell,那么我想我会使用:

ACTION=${1:+' '}
: ${ACTION:=echo}
Run Code Online (Sandbox Code Playgroud)

这有点作弊 - 如果脚本有参数,它会创建一个空白操作而不是空操作.如果没有参数,则在第二行之前ACTION为空.在第二行,如果action为空,则将其设置为"echo".在扩展中,由于您(正确地)不引用$ ACTION,因此不会为空白传递参数.

测试器(xx.sh):

ACTION=${1:+' '}
: ${ACTION:=echo}

echo $ACTION rm -f a b c
Run Code Online (Sandbox Code Playgroud)

测试:

$ sh xx.sh 1
rm -f a b c
$ sh xx.sh
echo rm -f a b c
$ sh xx.sh ''
echo rm -f a b c
$ 
Run Code Online (Sandbox Code Playgroud)

如果最后一行不正确,则从加号之前删除冒号.


如果子shell是可接受的,则这两个单行中的一个可以工作:

ACTION=$([ -z "$1"     ] && echo echo)
ACTION=$([ -z "${1+X}" ] && echo echo)
Run Code Online (Sandbox Code Playgroud)

第一个对应于上面显示的第一个版本(空的第一个参数被视为缺席); 第二个处理空参数.你可以写:

ACTION=$([ -z "${1:+X}" ] && echo echo)
Run Code Online (Sandbox Code Playgroud)

与第二个更清楚的人建立关系 - 除了你只使用一个或另一个,而不是两者.


由于我的评论中的降价符号使系统混淆(或者我弄错了但没有足够快地修复它),我的最后一条评论(稍作修改)应该是:

符号${var:+' '}表示'如果$var已设置且不为空,则使用+'后面的内容'(在这种情况下,是一个空白).符号${var+' '}表示'如果$var已设置 - 无论是否为空 - 然后使用+' 后面的内容.这些其他扩展类似:

  • ${var:=X}- 设置$varX除非它已经具有非空值.
  • ${var:-X}- $var如果它具有非空值,则展开为扩展为Xif $var未设置或为空

删除冒号会删除测试中的"空"部分.