【问题标题】:Creating a string variable name from the value of another string从另一个字符串的值创建一个字符串变量名
【发布时间】:2012-12-05 04:59:40
【问题描述】:

在我的 bash 脚本中,我有两个变量 CONFIG_OPTIONCONFIG_VALUE,它们分别包含字符串 VENDOR_NAMEDefault_Vendor

我需要创建一个名为$CONFIG_OPTIONVENDOR_NAME 的变量并将CONFIG_VALUE 中的值分配给新创建的变量。

我该怎么做?

我试过了

$CONFIG_OPTION=$CONFIG_VALUE

但是我在这条线上遇到了一个错误

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

谢谢。

【问题讨论】:

标签: bash unix


【解决方案1】:

这使用 bash 内置函数:

#!/bin/bash

VAR1="VAR2"

declare "${VAR1}"="value"

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

脚本输出:

VAR1=VAR2
VAR2=value

这是使用变量名的 sn-p:

#!/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

【讨论】:

  • 我发现declare 语法比使用printf 更容易阅读
  • 但声明是 bash 特定的,因此,不可移植。
  • 我喜欢在@gniourf_gniourf 的答案中使用printf,直到我看到这个答案并记住了这种方法,这对于我之后的编码人员来说更加有用和直观。 :)
【解决方案2】:

我知道没有人会提到它,所以我开始了。你可以使用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"

【讨论】:

  • 非常感谢您提供了一个相当令人惊讶的... [可悲的是,我不明白这是如何工作的] :)
  • 你可以阅读help printf-v 选项到 printf 意味着它应该将格式化的字符串分配给变量,该变量的名称紧跟在 -v 选项之后。
  • 这似乎至少在某些外壳(例如,灰壳)中不起作用。 (虽然问题是专门针对 Bash 的,所以这没什么大不了的。)
  • @iletras: -v 是 Bash 的 builtin printf 的开关。因此,可以通过以下方式找到文档:1. 在 Bash 提示符中输入 help printf,2. 使用 man bash 阅读 Bash 的人,3. 阅读 online reference manual
  • @Javon:修复! :)
【解决方案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 选项吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多