我所追求的是拥有最紧凑的表达式,扩展特殊参数@
,偏移量为2
,否则为默认值foobar
下标扩展为空字符串或null
。我尝试了以下符号,但没有运气:
"$@:2:-foobar"
"${@:2:-foobar}"
"${@:2: -foobar}"
有这么紧凑的符号吗?或者,类似的解决方案是什么;理想情况下没有临时变量?
答案 0 :(得分:0)
您可以组合第二个参数的扩展或其默认值,然后是下一个偏移的扩展。
假设你的数组是程序或函数的参数数组$@
那么,
#!/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}"
)不会&# 39;似乎工作。在这种情况下,假设您不想引入临时变量,最好的选择是使用函数或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}
)
但是,可读性会受到影响。