2017-08-15 3 views
1

現在、入力文字列を受け取って定義された配列名として使用するスクリプトを作成しています。ユーザからの入力が「A」である場合しかし、私はこれで立ち往生、おかげで事前BASHで定義された配列名としての入力文字列について

a=(1 2 3) 
b=(4 5 6) 
c=(7 8 9) 

に、私はresult_arrayは、(1 2 3)のようになりますしたいですか?

a=(1 2 3); b=(4 5 6); input="a"; result_array=("${${input}[@]}"); echo ${result_array[@]} 

bash: ${${input}[@]}: bad substitution 

私が欲しいのは、次のとおりです。result_array=("${${input}[@]}") => result_array=("${a[@]}") = (1 2 3)

注:私は、 "入力= AまたはBまたはCの場合、result_array = AまたはBまたはC" のようなIF文私がしなければならないので、使用したいいけませんこのステップを何度もやりなさい。

答えて

1
a=(1 2 3); 
b=(4 5 6); 
# ... 
input="a"; # get the user input 
result_array=${input}[@]; 
echo \(${!result_array}\) 

が印刷されます:

(1 2 3) 
+1

偉大declare -n input=b

  • 使用indirect expansionを使用する必要があります!それだけが必要。ありがとうございます –

  • 1

    ケースは、この場合にはIFよりも簡単です。また、より速い。

    #!/bin/bash 
    
    case "$1" in 
        a) result_array=(1 2 3);; 
        b) result_array=(4 5 6);; 
        c) result_array=(7 8 9);; 
    esac 
    
    echo ${result_array[@]} 
    

    私はまた、あなたがIFを使いたくないと言ったので、aとコンパイルされたchar asciiの位置に従って配列を計算しました。

    #!/bin/bash 
    
    # a ascii value 
    a_num=$(echo a|od -t d1 | awk '{printf "%s" ,$2}') 
    
    # input ascii value 
    ascii=$(echo $1|od -t d1 | awk '{printf "%s" ,$2}') 
    
    multiplier=$((($ascii - $a_num) * 3)) 
    
    result_array=($((1 + $multiplier)) $((2 + $multiplier)) $((3 + $multiplier))) 
    
    echo ${result_array[@]} 
    

    Ouputs:

    ./ascii.sh a 
    1 2 3 
    ./ascii.sh b 
    4 5 6 
    ./ascii.sh c 
    7 8 9 
    ./ascii.sh w 
    67 68 69 
    ./ascii.sh x 
    70 71 72 
    
    +0

    私は最初にしたいものではありませんが、私はあなたのアイデア(この状況を処理するために "ケース"を使用して)が好きです。どうもありがとう –

    0

    これを行うには2通りの方法があります。 input=bが不十分である、bを指すようにinput変数を "再利用" する

    declare -n input     # set the "nameref" attribute for the variable 
    result_array=("${input[@]}") 
    printf "%s\n" "${result_array[@]}" 
    
    1 
    2 
    3 
    

    a=(1 2 3) 
    b=(4 5 6) 
    # ... 
    input="a" 
    
    1. から出発nameref(バッシュV4.4)を使用します。それはinput[0](したがってa[0])を "b"に設定します。 (@tsoが彼の答えで行ったように)あなたは

      tmp="${input}[@]"   # a string that looks like array expansion 
      result_array=("${!tmp}") 
      printf "%s\n" "${result_array[@]}" 
      
      1 
      2 
      3 
      
    関連する問題