从另一个字符串的值创建一个字符串变量名

24
在我的bash脚本中,我有两个变量CONFIG_OPTIONCONFIG_VALUE,它们分别包含字符串VENDOR_NAMEDefault_Vendor
我需要创建一个名为$CONFIG_OPTION(即VENDOR_NAME)的变量,并将CONFIG_VALUE中的值赋给新创建的变量。
我该如何实现这个目标?
我尝试过:
$CONFIG_OPTION=$CONFIG_VALUE

但是我在这一行代码上遇到了错误:

'./Build.bash: line 137: VENDOR_NAME="Default_Vendor": command not found'

谢谢。


1
尽管没有完全相同的问题,但有多个答案,例如:http://stackoverflow.com/a/7776409/27862 - user123444555621
4个回答

44
我知道没有人会提到它,所以我来说一下。你可以使用printf
#!/bin/bash

CONFIG_OPTION="VENDOR_NAME"
CONFIG_VALUE="Default_Vendor"

printf -v "$CONFIG_OPTION" "%s" "$CONFIG_VALUE"

# Don't believe me?
echo "$VENDOR_NAME"

非常感谢这个惊喜...[遗憾的是,我不理解它是如何工作的] :) - NeonGlow
你可以阅读 help printfprintf-v 选项意味着它应该将格式化后的字符串赋值给紧随 -v 选项后给出的变量名。 - gniourf_gniourf
3
这似乎在一些 shell(例如 ash shell)中不起作用。(尽管问题特别针对 Bash,所以没什么大不了的。) - user234932
1
@iletras:-v是Bash内置的printf命令的开关。因此,可以通过以下方式找到文档:1.在Bash提示符下键入help printf,2.使用man bash阅读Bash的手册,3.阅读在线参考手册 - gniourf_gniourf
1
@Javon:已修复!:) - gniourf_gniourf
显示剩余2条评论

22

这使用了 bash 内置命令:

#!/bin/bash

VAR1="VAR2"

declare "${VAR1}"="value"

echo "VAR1=${VAR1}"
echo "VAR2=${VAR2}"

脚本的输出:

VAR1=VAR2
VAR2=value

这是使用您的变量名称的代码片段:

#!/bin/bash

CONFIG_OPTION="VENDOR_NAME"

declare "${CONFIG_OPTION}"="value"

echo "CONFIG_OPTION=${CONFIG_OPTION}"
echo "VENDOR_NAME=${VENDOR_NAME}"

脚本的输出:

CONFIG_OPTION=VENDOR_NAME
VENDOR_NAME=value

1
我发现使用 declare 语法比使用 printf 更容易阅读。 - Fred Schoen
1
但是声明是 bash 特定的,因此不可移植。 - Sebastian
我很喜欢 @gniourf_gniourf 的答案中使用 printf,直到我看到这个答案并记起了这种更有用和直观的方法,对于接下来的程序员来说更加友好。 :) - theVinchi

3

如果只使用纯shell,可以尝试以下方法:

#!/usr/bin/env sh

option=vendor_name
value="my vendor"

eval $option="'$value'" # be careful with ', \n, and \ in value
eval echo "\$$option" # my vendor
echo "$vendor_name" # my vendor

为什么?
#!/usr/bin/env sh
printf -v "var" "val" # prints the flag, var not set
declare var=val # sh: declare: not found
echo ${!var} # sh: syntax error: bad substitution

我不喜欢使用eval,但是是否有任何POSIX选项?


1

现有的答案对于字符串很好用,但是对于数组不起作用。这里提供一种适用于数组的解决方案:

ARRAY=(a b c d e f)
array_name="ARRAY_NAME"

TARGET_ARRAY="${array_name}[@]"      # ARRAY="ARRAY[@]"
TARGET_ARRAY=("${!TARGET_ARRAY}")    # ARRAY=(a b c d e f)

数组名称字符串也可以有*后缀以获取数组元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接