如果我坚持用少于 4 行并且没有子 shell 来完成它,那么我想我会使用:
ACTION=${1:+' '}
: ${ACTION:=echo}
这有点作弊 - 如果脚本有参数,它会创建一个空白动作而不是空动作。如果没有参数,则 ACTION 在第二行之前为空。在第二行,如果 action 为空,则将其设置为“echo”。在扩展中,由于您(正确地)没有引用 $ACTION,因此不会为空白传递任何参数。
测试员(xx.sh):
ACTION=${1:+' '}
: ${ACTION:=echo}
echo $ACTION rm -f a b c
Tests:
$ 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
$
如果最后一行不正确,则删除加号之前的冒号。
如果子 shell 是可接受的,则以下两行之一可以工作:
ACTION=$([ -z "$1" ] && echo echo)
ACTION=$([ -z "${1+X}" ] && echo echo)
第一个对应于上面显示的第一个版本(空的第一个参数被视为不存在);第二个处理当前的空参数。你可以写:
ACTION=$([ -z "${1:+X}" ] && echo echo)
使与第二个的关系更清晰 - 除非你只使用其中之一,而不是两者。
由于我的评论中的降价符号混淆了系统(或者我弄错了但没有足够快地修复它),我的最后一条评论(稍作修改)应该是:
符号${var:+' '}
意思是“如果$var
已设置且不为空,然后使用以下内容+
'(在本例中,是一个空格)。符号${var+' '}
意思是“如果$var
已设置 - 无论它是否为空 - 然后使用后面的内容+
'。这些其他扩展是类似的:
-
${var:=X}
- set $var
to X
除非它已经具有非空值。
-
${var:-X}
- 扩展到$var
如果它具有非空值并扩展到X
if $var
未设置或为空
删除冒号会删除测试的“空”部分。