如何为bash变量指定默认列表值?

问题描述 投票:1回答:2

我理解语法:

foo=${bar:-mydefault}

foo设置为$bar(如果存在的话)和mydefault(如果不存在的话)。这适用于简单的标量值。但我无法弄清楚如何为列表设置默认值。我尝试过这样的事情:

foo=${bar[@]:-(my de fault)}

但这不起作用。这是我的默认值,它确实将${bar[@]}指定为列表(如果存在)。如何才能做到这一点?

arrays bash
2个回答
2
投票

bash中没有数组值这样的东西。 foo=(...)是一种特殊形式的任务,而不是常规任务的特殊RHS。你最接近你想要的是首先尝试制作bar的副本,然后检查是否实际定义了foo。 (如果bar为空,foo实际上尚未定义,尽管名称为foo的数组属性已设置。)

foo=( "${bar[@]}" )
if ! [[ -v foo  ]]; then
    foo=(my de fault)
fi

请注意,即使foo=( "${bar[@]}" )也没有制作bar的精确副本;确切的指数不予保留。

$ bar=([0]=zero [9]=nine)
$ foo=( "${bar[@]}" )
$ declare -p foo bar
declare -a foo=([0]="zero" [1]="nine")
declare -a bar=([0]="zero" [9]="nine")

要保留索引,您还需要直接在bar中迭代它们:

$ foo=()
$ for i in "${!bar[@]}"; do foo[i]=${bar[i]}; done

-1
投票
foo=(${bar[@]:-my de fault})

my de fault中删除括号,然后将其转换回数组。

© www.soinside.com 2019 - 2024. All rights reserved.