我想要的是拥有最紧凑的表达式,该表达式将特殊参数@
扩展为偏移量为 2
,或者如果下标扩展到空字符串或null
,则将其扩展为默认值 foobar
。我尝试了以下符号,但没有运气:
"$@:2:-foobar"
"${@:2:-foobar}"
"${@:2: -foobar}"
有这么紧凑的符号吗?或者,类似的解决方案是什么;理想情况下没有临时变量?
您可以组合第二个参数或其默认值的扩展,然后从下一个偏移量开始扩展。
假设你的数组是程序或函数的参数数组$@
那么,
#!/bin/bash
echo A "${@:2}"
echo B "${@:2:}" # your attempt #1
echo C "${@:2-foobar}" # your attempt #2
echo D "${@:2: -foobar}" # your attempt #3
echo E "${2:-foobar}"
echo F "$1" "${2:-foobar}" ${@:3}
G=("$1" "${2:-foobar}" ${@:3})
echo G "${G[@]}"
将为行 F 和 G 产生所需的结果(G 使用临时变量)。
前任:
$ bash expand.sh 1
A
B
C
D
E foobar
F 1 foobar
G 1 foobar
$ bash expand.sh 1 2 3 4
A 2 3 4
B
C 2 3 4
D
E 2
F 1 2 3 4
G 1 2 3 4
如果您尝试使用与"$@"不同的数组执行此操作,例如H=(1 2 3)
,提供索引扩展("${H[2]:-foobar}"
)的默认值似乎不起作用。在这种情况下,假设您不想引入临时变量,最好的选择是使用函数或 eval。但是在这一点上,您可能最好添加一个条件,例如,
# assuming that H wasn't sparse. redefine H based on its values
H=(
"${H[0]}"
$([[ -n "${H[1]}" ]] && echo "${H[1]}" || echo "foobar")
${H[@]:2}
)
但是,可读性会受到影响。