我理解语法:
foo=${bar:-mydefault}
将foo
设置为$bar
(如果存在的话)和mydefault
(如果不存在的话)。这适用于简单的标量值。但我无法弄清楚如何为列表设置默认值。我尝试过这样的事情:
foo=${bar[@]:-(my de fault)}
但这不起作用。这是我的默认值,它确实将${bar[@]}
指定为列表(如果存在)。如何才能做到这一点?
在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
foo=(${bar[@]:-my de fault})
从my de fault
中删除括号,然后将其转换回数组。