是否可以使用间接方式设置变量?

是否可以使用间接方式设置变量?

例如,下一个脚本将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

的参数evalB=$tmp,一个简单的赋值。即使它包含空格或通配字符,也不需要双引号$tmp,因为这些字符不会在赋值中扩展。

如果你想创建一个环境变量,你可以使用export.在 bash 或 ksh 或 zsh 中,您可以使用typeset它来创建局部变量(declare在 bash 中是同义词)。同样,您应该使用中间变量,以免特殊字符被破坏。请注意,除了 zsh 之外,您需要在变量扩展周围加上双引号,因为这不是赋值,而是一个内置函数,它采用的参数恰好看起来像赋值。

export $A="$tmp"

答案3

您可以尝试的另一种方法:

$ A=B
$ read $A <<< 81
$ echo "$B"
81

但与所有这些方法一样,存在安全风险(!) 。在这种情况下declare,必须控制左侧( 的值),换句话说,至少在 中,变量不应包含用户控制的输入,例如输入文件等......typeseteval$Abash$A


如果您的 shell 不支持此处字符串 ( <<<),您也可以使用此处文档:

A=B
read $A << EOF
82
EOF
echo "$B"

答案4

另一种方法是使用 with printf,它将其输出分配给一个变量,该变量的名称可以通过参数传递-v

A=B
printf -v "$A" '%s' "Hello"
echo ${!A}

相关内容