例如,下一个脚本将Hello
根据${!
规则打印。
A=B
B=Hello
echo ${!A}
但我怎样才能放具有间接名称的变量的值?直接使用!
符号是行不通的:
A=B
!A=Hello # here is tricky line
echo $B
我知道使用临时文件有一个技巧,但我对使用间接感兴趣,而不是类似的东西
A=B
echo "$A=Hello" > 1.tmp
. 1.tmp
echo $B
答案1
您可以使用typeset
内置函数来执行此操作:
$ A=B
$ typeset $A=42
$ echo $B
42
或者使用declare
:
$ declare $A=1
$ echo $B
1
答案2
继获取变量值时的间接方式……
便携的方式是使用eval
.您必须注意引号,以便值中的特殊字符不会在不应该被评估的时候被评估。最简单的方法是将新值存储在中间变量中并分配该变量的值。
A=B
tmp='stuff with special characters or whatever…'
eval $A=\$tmp
的参数eval
是B=$tmp
,一个简单的赋值。即使它包含空格或通配字符,也不需要双引号$tmp
,因为这些字符不会在赋值中扩展。
如果你想创建一个环境变量,你可以使用export
.在 bash 或 ksh 或 zsh 中,您可以使用typeset
它来创建局部变量(declare
在 bash 中是同义词)。同样,您应该使用中间变量,以免特殊字符被破坏。请注意,除了 zsh 之外,您需要在变量扩展周围加上双引号,因为这不是赋值,而是一个内置函数,它采用的参数恰好看起来像赋值。
export $A="$tmp"
答案3
您可以尝试的另一种方法:
$ A=B
$ read $A <<< 81
$ echo "$B"
81
但与所有这些方法一样,存在安全风险(!) 。在这种情况下declare
,必须控制左侧( 的值),换句话说,至少在 中,变量不应包含用户控制的输入,例如输入文件等......typeset
eval
$A
bash
$A
如果您的 shell 不支持此处字符串 ( <<<
),您也可以使用此处文档:
A=B
read $A << EOF
82
EOF
echo "$B"
答案4
另一种方法是使用 with printf
,它将其输出分配给一个变量,该变量的名称可以通过参数传递-v
:
A=B
printf -v "$A" '%s' "Hello"
echo ${!A}