错误替换 - 其他变量名称中的变量名称 - 在Bash中

时间:2016-12-06 18:46:35

标签: bash

我的一个脚本中有一个问题,这里简化了。 我想在其中使用另一个变量来命名变量。我的剧本是:

#! /bin/bash
j=1
SAMPLE${j}_CHIP=5
echo ${SAMPLE${j}_CHIP}

这个脚本回应:

line 3: SAMPLE1_CHIP=5: command not found
line 4: ${SAMPLE${j}_CHIP}: bad substitution

我试图这样做是为了在while循环中命名几个样本来改变" j"参数。 任何人都知道如何命名这样的变量?

5 个答案:

答案 0 :(得分:2)

可以使用eval,但不要使用动态变量名称。阵列要好得多。

$ j=1
$ SAMPLES[j]=5
$ echo ${SAMPLES[j]}
5

您可以像这样一次初始化整个数组:

$ SAMPLES=(5 10 15 20)

你可以追加:

$ SAMPLES+=(25 30)

指数从0开始。

答案 1 :(得分:0)

如果你真的想使用变量变量:

#! /bin/bash
j=1
var="SAMPLE${j}_CHIP"
export ${var}=5
echo "${!var}" # prints 5

但是,还有其他一些方法可以解决父问题,这种方法可能比这种方法更容易混淆。

答案 2 :(得分:0)

j=1
eval "SAMPLE${j}_CHIP=5" 
echo "${SAMPLE1_CHIP}"

或者

j=1
var="SAMPLE${j}_CHIP"
eval "$var=5" 
echo "${!var}" 

答案 3 :(得分:0)

要读取变量的值,您可以使用间接:${!var}

#! /bin/bash
j=1
val=get_5
var=SAMPLE${j}_CHIP

declare "$var"="$val"

echo "${!var}"

问题是让变量得到值 我在上面使用了declare,已知的选项是:

declare "$var"="$val"
printf -v "$var" '%s' "$val"
eval $var'=$val'
export "$var=$val"

最危险的选择是使用eval。如果外部用户可以设置varval的内容,则可以设置获取代码注入的方法。今天看起来似乎很安全,但是在某人因为某些原因编辑代码之后,它可能会被改变以使攻击者有机会“进入”。

可能最好的解决方案是避免以上所有。

关联数组

另一种方法是使用关联数组:

#! /bin/bash
j=1
val=get_5
var=SAMPLE${j}_CHIP
declare -A array

array[$var]=$val
echo "${array[$var]}"

风险相当低,你得到一个类似的命名索引。

普通数组

但很明显,最安全的解决方案是使用最简单的解决方案:

#! /bin/bash
j=1
val=get_5

array[j]=$val
echo "${array[j]}"

全部完成,风险很小。

答案 4 :(得分:0)

正如其他人所说,这通常是不可能的。如果您愿意,这是一个解决方法。请注意,在声明嵌套变量时必须使用eval,而在访问它时需要使用⭗而不是$(我使用⭗作为函数名,因为为什么不呢)。

#!/bin/bash
function ⭗ {
    if [[ ! "$*" = *\{*\}* ]]
    then echo $*
    else ⭗ $(eval echo $(echo $* | sed -r 's%\{([^\{\}]*)\}%$(echo ${\1})%'))
    fi
}
j=1
eval SAMPLE${j}_CHIP=5
echo `⭗ {SAMPLE{j}_CHIP}`
c=CHIP
echo `⭗ {SAMPLE{j}_{c}}`