如何在 shell 脚本中创建一个名称存在于变量中的变量?
How to create a variable in shell script whose name is present in variable?
假设我在 shell 脚本中像这样声明两个变量键和值
$ key=key1
$ value=value1
现在我想创建一个名为 key1 的变量并为其赋值 value1。我试过的是
$ export ${key}
$ export ${value}
$ $($key=$value)
输出:key1=value1:找不到命令
我不知道该怎么做。
使用eval $key=$value
代替$($key=$value)
:shell先替换变量值,然后$(...)
替换。由于没有具有该名称的命令,shell 在 STDERR 中显示 command not found
。使用 eval
告诉 shell 将替换结果作为常规 shell 命令再次求值。稍后您可以使用 export $key
导出结果。为 shell 使用 -x
标志可以很好地了解发生的情况:
$ key=key1
$ value=value1
$ set -x
$ $key=$value
+ key1=value1
sh: key1=value1: not found [No such file or directory]
$ $($key=$value)
+ key1=value1
sh: key1=value1: not found [No such file or directory]
$ eval $key=$value
+ eval key1=value1
+ key1=value1
$ echo $key1
+ echo value1
value1
$ export $key
+ export key1
此外,以这种方式处理变量时要小心:shell 变量中的空格在这种结构中可能会产生意想不到的结果。
假设我在 shell 脚本中像这样声明两个变量键和值
$ key=key1
$ value=value1
现在我想创建一个名为 key1 的变量并为其赋值 value1。我试过的是
$ export ${key}
$ export ${value}
$ $($key=$value)
输出:key1=value1:找不到命令
我不知道该怎么做。
使用eval $key=$value
代替$($key=$value)
:shell先替换变量值,然后$(...)
替换。由于没有具有该名称的命令,shell 在 STDERR 中显示 command not found
。使用 eval
告诉 shell 将替换结果作为常规 shell 命令再次求值。稍后您可以使用 export $key
导出结果。为 shell 使用 -x
标志可以很好地了解发生的情况:
$ key=key1 $ value=value1 $ set -x $ $key=$value + key1=value1 sh: key1=value1: not found [No such file or directory] $ $($key=$value) + key1=value1 sh: key1=value1: not found [No such file or directory] $ eval $key=$value + eval key1=value1 + key1=value1 $ echo $key1 + echo value1 value1 $ export $key + export key1
此外,以这种方式处理变量时要小心:shell 变量中的空格在这种结构中可能会产生意想不到的结果。