我所追求的是拥有最紧凑的表达式,该表达式将特殊参数 @
的偏移量扩展为 2
或扩展为默认值 foobar
如果下标扩展为空字符串或 null
。我尝试了以下符号但没有运气:
"$@: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}
)
但是,可读性会受到影响。
关于bash - 如何将 Bash 数组偏移量与默认值结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29615980/