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

Arrays 将输入字符串视为BASH中定义的数组名称,arrays,bash,Arrays,Bash,我目前正在编写一个脚本,该脚本接收输入字符串,然后将其用作已定义的数组名。但我坚持了下来,提前谢谢你 a=(1 2 3) b=(4 5 6) c=(7 8 9) 如果用户的输入是“a”,我希望数组的结果是(1 2 3) 我想要的是:result\u数组=(“${${input}[@]}”)=>result\u数组=(“${a[@]}”)=(123) 注意:我不想使用IF语句,比如“IF input=a或b或c,result\u array=a或b或c”,因为我必须多次执行此步骤 a=(1 2

我目前正在编写一个脚本,该脚本接收输入字符串,然后将其用作已定义的数组名。但我坚持了下来,提前谢谢你

a=(1 2 3)
b=(4 5 6)
c=(7 8 9)
如果用户的输入是“a”,我希望数组的结果是(1 2 3)

我想要的是:
result\u数组=(“${${input}[@]}”)=>result\u数组=(“${a[@]}”)=(123)

注意:我不想使用IF语句,比如“IF input=a或b或c,result\u array=a或b或c”,因为我必须多次执行此步骤

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

(1 2 3)

这个例子比这个例子更简单。也更快

#!/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[@]}
我还制作了一个脚本,根据与a比较的字符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[@]}
输出:

./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

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

a=(1 2 3)
b=(4 5 6)
# ...
input="a"
  • 使用(bash v4.4)

    要“重用”指向
    b
    input
    变量,
    input=b
    不足。这将
    输入[0]
    (因此
    a[0]
    )设置为“b”。您需要使用
    declare-n input=b

  • 使用(正如@tso在回答中所做的那样)


  • 伟大的这就是我需要的。谢谢虽然这不是我一开始想要的,但我喜欢你的想法(用“案例”来处理这种情况)。非常感谢
    a=(1 2 3)
    b=(4 5 6)
    # ...
    input="a"
    
    declare -n input                 # set the "nameref" attribute for the variable
    result_array=( "${input[@]}")
    printf "%s\n" "${result_array[@]}"
    
    1
    2
    3
    
    tmp="${input}[@]"           # a string that looks like array expansion
    result_array=( "${!tmp}" )
    printf "%s\n" "${result_array[@]}"
    
    1
    2
    3