2016-12-06 4 views
0

私のスクリプトの1つに問題があります。ここでは単純化しています。 変数に別の変数を使用して変数の名前を付けたいとします。私のスクリプトは次のとおりです。不正な置換 - 他の変数名の中の変数名 - 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 

私は「J」のパラメータを変更するwhileループでいくつかのサンプルに名前を付けるために、それをやろうとしています。 誰かがそのような変数に名前を付ける方法を知っていますか?

+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のを使用することです。 varまたはvalの内容が外部ユーザーによって設定されている場合は、コードインジェクションを取得する方法を設定しています。今日は安全だと思われるかもしれませんが、何らかの理由で誰かがコードを編集した後、攻撃者に "入る"機会を与えるように変更される可能性があります。

おそらく最も良い解決策は、上記のすべてを避けることです。

連想配列

1つの選択肢は、連想配列を使用することです:

#! /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を使用し、アクセスするときは$の代わりに⭗を使用する必要があることに注意してください(私は関数名としてuseを使用します)。

#!/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}}` 
関連する問題