2017-08-15 48 views
1

我目前正在處理接收輸入字符串的腳本,然後將其用作定義的數組名稱。但我堅持這一點,在此先感謝將輸入字符串視爲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)

注:我不想使用IF語句,如 「如果輸入= A或B或C,result_array = A或B或C」,因爲我有多次執行此步驟。

回答

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

太棒了!這就是我需要的。謝謝 –

1

案例是在這種情況下比,如果更簡單。也更快。

#!/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[@]} 

我也做了根據司儀的ASCII字符位置的腳本計算陣列,因爲你說你不喜歡用IF。

#!/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

雖然它不是我想要的,但我喜歡你的想法(使用「case」來處理這種情況)。非常感謝 –

0

有2種方式來做到這一點。從

a=(1 2 3) 
b=(4 5 6) 
# ... 
input="a" 
  1. 使用nameref(bash的V4.4)開始

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

    爲了 「重新使用」 的input變量指向binput=b不足。這將input[0](並因此a[0])設置爲「b」。你需要使用declare -n input=b

  2. 使用indirect expansion(如@tso在他的回答一樣)

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