2016-12-06 104 views
0

我的脚本中有一个问题,在这里它被简化了。 我想用一个变量来命名变量。我的脚本是:错误的替换 - 其他变量名称内的变量名 - 在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”参数几个样品。 任何人都知道如何命名这样的变量?

+0

您打算在'bash'中使用变量上下文还是数组上下文吗? – Inian

回答

2

这可能与eval,但不使用动态变量名称。阵列非常好,好多了。

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

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

$ SAMPLES=(5 10 15 20) 

而且可以追加与:

$ SAMPLES+=(25 30) 

指数为0。

+0

但是我想要的是命名变量“SAMPLES_CHIP1”并在其中保存一个值,以便将此变量作为输入参数引入其他脚本中 –

+3

“你需要”是安全性和可维护性的噩梦。 – chepner

0

如果你真的开始想要使用变量变量:

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

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

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

或者

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

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

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

declare "$var"="$val" 

echo "${!var}" 

的问题是把这些变量中获得的价值。
我用上面的声明,和已知的选项有:

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]}" 

全部完成,风险不大。

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}}`