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

问题描述 投票:0回答:5

在我的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'

谢谢。

bash unix
5个回答
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"

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

4
投票

对于纯 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)

array_name
字符串也可以带有
*
后缀来获取数组元素。


0
投票

在 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
© www.soinside.com 2019 - 2024. All rights reserved.