2016-12-06 102 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}}`