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

时间:2015-04-13 22:14:43

标签: bash

我所追求的是拥有最紧凑的表达式,扩展特殊参数@,偏移量为2,否则为默认值foobar下标扩展为空字符串或null。我尝试了以下符号,但没有运气:

"$@:2:-foobar"
"${@:2:-foobar}"
"${@:2: -foobar}"

有这么紧凑的符号吗?或者,类似的解决方案是什么;理想情况下没有临时变量?

1 个答案:

答案 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}
  )

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