![ECHO 变量的 Linux ECHO 输出](https://linux22.com/image/150732/ECHO%20%E5%8F%98%E9%87%8F%E7%9A%84%20Linux%20ECHO%20%E8%BE%93%E5%87%BA.png)
我有一个变量(var
),其返回值为VAR1
($var
具有值VAR1
)。有一个输入文件VAR1
定义了 ( VAR1=ABCDEF
)
我如何使用来echo
获取值?ABCDEF
$var
我尝试了echo $(echo $var)
许多其他选项,但我总是得到输出 as VAR1
orecho VAR1
但从来没有ABCDEF
。我在声明source
的文件中使用VAR1
,在命令提示符等中尝试过。
答案1
假设您使用的是bash
shell:
$ source ./file
$ echo "$VAR1"
ABCDEF
$ var=VAR1
$ echo "${!var}"
ABCDEF
通过使用${!var}
你使用变量间接在bash
。变量的值var
用于获取要扩展的变量的名称。
您bash
还可以使用名称引用变量:
$ source ./file
$ echo "$VAR1"
ABCDEF
$ declare -n var="VAR1"
$ echo "$var"
ABCDEF
在这里,var
变量指的是VAR1
变量,因此$var
将扩展为$VAR1
扩展为的任何内容。
名称引用最初是一个ksh
功能,在该 shell 中它们是用 声明的typeset -n
。
名称引用对于在调用 shell 函数时传递对数组的引用非常有用。
在任何sh
外壳中:
$ . ./file
$ echo "$VAR1"
ABCDEF
$ var=VAR1
$ eval "echo \"\$$var\""
ABCDEF
该eval
实用程序采用一个将重新评估的字符串。在这里,我们给它字符串echo "$VAR1"
(扩展后$var
)。
问题在于eval
,如果不小心创建参数字符串,很容易引入错误或漏洞。
答案2
假设您正在使用bash
,您可以通过间接引用轻松完成此操作:
$ foo=bar
$ bar=magicword
$ printf "%s\n" "${!foo}"
magicword
语法$var
(or ${var}
) 产生变量 的内容var
。
语法${!var}
生成变量的内容命名于 var
。