如何将 Bash 数组偏移量与默认值组合



我想要的是拥有最紧凑的表达式,该表达式将特殊参数@扩展为偏移量为 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}
  )

但是,可读性会受到影响。

相关内容

  • 没有找到相关文章

最新更新