如何在bash中将变量的值用作另一个变量的名称

Hai*_*ang 42 bash

我想声明一个变量,其名称来自另一个变量的值,我编写了以下代码:

a="bbb"
$a="ccc"
Run Code Online (Sandbox Code Playgroud)

但它不起作用.完成这项工作的正确方法是什么?

Kaz*_*Kaz 55

eval用于此,但如果你天真地做,将会有令人讨厌的逃避问题.这种事情通常是安全的:

name_of_variable=abc

eval $name_of_variable="simpleword"   # abc set to simpleword
Run Code Online (Sandbox Code Playgroud)

这打破了:

eval $name_of_variable="word splitting occurs"
Run Code Online (Sandbox Code Playgroud)

修复:

eval $name_of_variable="\"word splitting occurs\""  # not anymore
Run Code Online (Sandbox Code Playgroud)

最终修复:将要分配的文本放入变量中.我们称之为safevariable.然后你可以这样做:

eval $name_of_variable=\$safevariable  # note escaped dollar sign
Run Code Online (Sandbox Code Playgroud)

逃离美元符号可以解决所有逃避问题.美元符号逐字存入eval函数,这将有效地执行此操作:

eval 'abc=$safevariable' # dollar sign now comes to life inside eval!
Run Code Online (Sandbox Code Playgroud)

当然,这项任务对一切都是免疫的.safevariable可以包含*,空格$等.(需要注意的是,我们假设只name_of_variable包含一个有效的变量名,我们可以自由使用:不是特别的.)


Fli*_*imm 42

你可以使用declare!,像这样:

John="nice guy"
programmer=John
echo ${!programmer} # echos nice guy
Run Code Online (Sandbox Code Playgroud)

第二个例子:

programmer=Ines
declare $programmer="nice gal"
echo $Ines # echos nice gal
Run Code Online (Sandbox Code Playgroud)

  • Bash 文档将 `${!var_name}` 形式称为“间接扩展”:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html (3认同)
  • 嗨,弗林姆。数组可以吗?像`echo "${!array[1]}"` 之类的东西? (2认同)
  • 请注意,这在函数内部不起作用,因为我发现 KAz 的 eval 解决方案可以工作。 (2认同)

pot*_*ong 16

这可能对你有用:

foo=bar
declare $foo=baz
echo $bar
baz
Run Code Online (Sandbox Code Playgroud)

或这个:

foo=bar
read $foo <<<"baz"
echo $bar
baz
Run Code Online (Sandbox Code Playgroud)


ano*_*ard 9

你可以利用eval这个.
例:

$ a="bbb"
$ eval $a="ccc"
$ echo $bbb
ccc
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


bat*_*tzi 6

如果你想获取变量的值而不是设置它,你可以这样做

var_name1="var_name2"
var_name2=value_you_want
eval temp_var=\$$var_name1
echo "$temp_var"
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读间接引用


Jos*_*h B -3

您可以使用来自另一个变量的值通过简单赋值来为变量赋值,如下所示:

#!/usr/bin/bash

#variable one
a="one"

echo "Variable a is $a"
#variable two with a's variable
b="$a"

echo "Variable b is $b"

#change a
a="two"
echo "Variable a is $a"
echo "Variable b is $b"
Run Code Online (Sandbox Code Playgroud)

其输出是这样的:

Variable a is one
Variable b is one
Variable a is two
Variable b is one
Run Code Online (Sandbox Code Playgroud)

所以一定要像这样分配它 b="$a" 并且你应该很好。