我的一个脚本中有一个问题,这里简化了。 我想在其中使用另一个变量来命名变量。我的剧本是:
#! /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"参数。 任何人都知道如何命名这样的变量?
答案 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。如果外部用户可以设置var
或val
的内容,则可以设置获取代码注入的方法。今天看起来似乎很安全,但是在某人因为某些原因编辑代码之后,它可能会被改变以使攻击者有机会“进入”。
可能最好的解决方案是避免以上所有。
另一种方法是使用关联数组:
#! /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}}`