我想制作一个 bash 脚本,它将采用 3 个不同的变量,并根据另一个变量的设置仅返回一个变量。因此,如果
TESTA_HOST=test1.google.com
TESTB_HOST=test2.google.com
TESTC_HOST=test3.google.com
M_INDEX=2
我们想要搜索所有以_HOST
数组结尾的环境变量,然后我们可以用它来与索引进行比较。
HOSTS="$(compgen -A variable | grep _HOST)"
export MAIN_URI="${HOSTS[M_INDEX]}"
echo $MAIN_URI
预期的输出是test3.google.com
这不起作用,因为它只是返回变量名称而不是变量内容。我在这里缺少什么?
答案1
这,
HOSTS="$(compgen -A variable | grep _HOST)"
设置HOSTS
为单个字符串
测试主机[新队]TESTB_HOST[新队]测试主机
对其建立索引不是很有用,与 、等${HOSTS[0]}
相同,将为空。${HOSTS}
${HOSTS[1]}
相反,如果您分配
HOSTS=( $(compgen -A variable | grep _HOST) )
然后 的输出compgen
将被分词(并扩展为全局),并HOSTS
成为包含结果的数组。该数组的值是变量的名称,您需要间接引用来获取它们的值。现在,这将扩展到“指向”变量的值index
:
"${!HOSTS[M_INDEX]}"
请注意,数组赋值假定您具有默认值IFS
,并且变量中不能包含任何空格或通配符。
请注意,如果您的变量被命名为HOST_this
和HOST_that
(前面有固定部分),您可以使用 生成它们的名称列表"${!HOST_@}"
,并将其直接分配给数组,而不涉及compgen
、grep
或分词。