我目前正在处理一个接收输入字符串的脚本,然后将其用作定义的数组名称。但我坚持这一点,提前谢谢
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”,因为我必须多次执行此步骤。
答案 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"
使用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
变量指向b
,input=b
不足。这会将input[0]
(以及a[0]
)设置为" b"。您需要使用declare -n input=b
使用indirect expansion(正如@tso在答案中所做的那样)
tmp="${input}[@]" # a string that looks like array expansion
result_array=( "${!tmp}" )
printf "%s\n" "${result_array[@]}"
1
2
3