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=''
,因此返回一个空行/空值.
如果我坚持用少于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}
- 设置$var
为X
除非它已经具有非空值.${var:-X}
- $var
如果它具有非空值,则展开为扩展为X
if $var
未设置或为空删除冒号会删除测试中的"空"部分.