将输入字符串视为BASH中定义的数组名称

时间:2017-08-15 09:02:23

标签: arrays bash

我目前正在处理一个接收输入字符串的脚本,然后将其用作定义的数组名称。但我坚持这一点,提前谢谢

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

如果用户的输入是“a”,我希望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语句,例如“if input = a或b或c,result_array = a或b或c”,因为我必须多次执行此步骤。

3 个答案:

答案 0 :(得分: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)

在这种情况下,案例比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[@]}

我还根据char 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

答案 2 :(得分:0)

有两种方法可以做到这一点。从

开始
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
    

    To"重用" 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