几周前,我参加了一个似乎来自 Windows 背景的人关于 Git 的演讲。我说“似乎是”是因为他在提到命令行选项时一直说“破折号”。然后我回忆起我在早期学习 Linux 时觉得很好奇的事情;也就是说,在提到选项时,常驻 Unix 负责人总是说“减号”。那是:
rm -rf /var/tmp/bogus/junk
Run Code Online (Sandbox Code Playgroud)
会说“arr em 减去arr ef”,而不是“arr em dash arr ef”。
为什么是这样?
Bash 手册页描述了使用${!a}返回名称为a(间接级别)内容的变量的内容。
我想知道如何使用这个返回数组中的所有元素,即,
a=(one two three)
echo ${a[*]}
Run Code Online (Sandbox Code Playgroud)
返回
one two three
Run Code Online (Sandbox Code Playgroud)
我想要:
b=a
echo ${!b[*]}
Run Code Online (Sandbox Code Playgroud)
返回相同。不幸的是,它没有,而是返回0。
更新
鉴于回复,我现在意识到我的例子太简单了,因为当然,像:
b=("${a[@]}")
Run Code Online (Sandbox Code Playgroud)
将完全实现我所说的我需要的。
所以,这就是我想要做的:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Run Code Online (Sandbox Code Playgroud)
当然,仔细阅读 Bash 手册页表明这不会按预期工作,因为最后一行只是返回“数组”的索引$_LIST(根本不是数组)。
在任何情况下,以下应该做的工作(如所指出的):
LIST=($(eval echo \${$_LIST[*]}))
Run Code Online (Sandbox Code Playgroud)
或者......(我最终走的路线):
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Run Code Online (Sandbox Code Playgroud)
当然,假设元素不包含空格。