【发布时间】:2015-01-06 21:39:11
【问题描述】:
鉴于3.5.3 Shell Parameter Expansion 部分中的Bash Reference Manual 说:
${!name[@]} ${!name[*]}如果 name 是一个数组变量,则扩展为 name 中分配的数组索引(键)列表。如果 name 不是一个数组,如果 name 被设置则扩展为 0,否则为 null。当使用“@”并且扩展出现在双引号内时,每个键都会扩展为一个单独的单词。
和
${参数:-word}
如果参数未设置或为空,则替换单词的扩展。否则,参数的值被替换。
和
${参数:+word}
如果参数为null或未设置,则不替换任何内容,否则替换单词的扩展。
有人可以向我解释以下扩展的输出吗:
$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
$ cat hm.sh
p() {
printf "%-11s : f=%1s : " "$*" "$f"
eval printf \'%1s :\\n\' "$@"
}
p '$f'
p '${!f[@]}'
p '${!f[@]:-b}'
echo "echo: ${!f[@]:-b} :"
p '${!f[@]:+b}'
echo "echo: ${!f[@]:+b} :"
f=f
p '$f'
p '${!f[@]}'
p '${!f[@]:-b}'
echo "echo: ${!f[@]:-b} :"
p '${!f[@]:+b}'
echo "echo: ${!f[@]:+b} :"
f=t
p '$f'
p '${!f[@]}'
p '${!f[@]:-b}'
echo "echo: ${!f[@]:-b} :"
p '${!f[@]:+b}'
echo "echo: ${!f[@]:+b} :"
$ bash hm.sh
$f : f= : :
${!f[@]} : f= : :
${!f[@]:-b} : f= : b :
echo: b :
${!f[@]:+b} : f= : :
echo: :
$f : f=f : f :
${!f[@]} : f=f : 0 :
${!f[@]:-b} : f=f : f :
echo: f :
${!f[@]:+b} : f=f : b :
echo: b :
$f : f=t : t :
${!f[@]} : f=t : 0 :
${!f[@]:-b} : f=t : b :
echo: b :
${!f[@]:+b} : f=t : :
echo: :
这就是为什么当内容不改变@987654328如何扩展时,所讨论变量的内容会改变${!name[@]:-default}和${!name[@]:+alt}扩展的扩展方式@ 扩展本身扩展?
【问题讨论】: