首页 > 解决方案 > ${!prefix@} 当使用 '@' 并且扩展出现在双引号内时

问题描述

我不明白 bash 手册中关于前缀参数扩展的内容。

bash 手册是这样说的:

${!prefix*}
${!prefix@}

扩展为名称以前缀开头的变量的名称,由 IFS 特殊变量的第一个字符分隔。当使用 '@' 并且扩展出现在双引号内时,每个变量名都会扩展为一个单独的单词。

当我在 bash 中执行此操作时:

aaa=1
aab=2
aac=3
echo "${!aa@}"

结果输出是这样的:aaa aab aac

这按预期工作。但是,问题是我在使用时得到了相同的输出,但echo "${!aa*}"我不明白其中的区别。

标签: bash

解决方案


echo用空格连接它的所有参数,并在最后用换行符打印结果。改为使用printf,您可以清楚地看到差异。

$ aaa=1
$ aab=2
$ aac=3
$ printf '<%s>\n' "${!aa@}"
<aaa>
<aab>
<aac>
$ printf '<%s>\n' "${!aa*}"
<aaa aab aac>

此外,while 的单词由;IFS的扩展中的第一个字符连接*IFS使用时根本不兑现@

$ IFS=,
$ echo "${!aa@}"
aaa aab aac
$ echo "${!aa*}"
aaa,aab,aac

推荐阅读