在我的bash脚本中,我有两个变量
CONFIG_OPTION
和CONFIG_VALUE
,分别包含字符串VENDOR_NAME
和Default_Vendor
。
我需要创建一个名为
$CONFIG_OPTION
的变量,即 VENDOR_NAME
并将 CONFIG_VALUE
中的值分配给新创建的变量。
我怎样才能做到这一点?
我试过了
$CONFIG_OPTION=$CONFIG_VALUE
但是我在这行遇到错误
'./Build.bash: line 137: VENDOR_NAME="Default_Vendor": command not found'
谢谢。
我知道没人会提到,所以我就开始吧。您可以使用
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"
这使用了 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
对于纯 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 选项吗?
现有答案非常适合字符串,但不适用于数组。 这是数组的有效解决方案:
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)
array_name
字符串也可以带有*
后缀来获取数组元素。
在 DASH 中测试 POSIX 兼容性。可能会遗漏一些奇怪的边缘情况,但对于简单的东西,它似乎可以工作。
set_variable() {
local name="${1:?Name required}"
local value="${2:?Value required}"
read "$name" <<EOF
$value
EOF
}
name=foobar
value=barfu
set_variable "$name" "$value"
echo $foobar