2
有沒有一種方法來動態訪問數組名稱?Bash數組名稱選擇
下面的循環工作原理:
#!/bin/bash
for i in 1 2 3 4 5; do
for j in 1 2 3 4 5; do
state="i=$i, j=$j"
case "$i" in
1) p_1+=("$state");;
2) p_2+=("$state");;
3) p_3+=("$state");;
4) p_4+=("$state");;
5) p_5+=("$state");;
*) break;;
esac
done
done
for i in {0..5}; do echo "${p_1[$i]}"; done
for i in {0..5}; do echo "${p_2[$i]}"; done
for i in {0..5}; do echo "${p_3[$i]}"; done
for i in {0..5}; do echo "${p_4[$i]}"; done
for i in {0..5}; do echo "${p_5[$i]}"; done
輸出看起來像:
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i=1, j=5
i=2, j=1
i=2, j=2
i=2, j=3
i=2, j=4
i=2, j=5
i=3, j=1
i=3, j=2
i=3, j=3
i=3, j=4
i=3, j=5
i=4, j=1
i=4, j=2
i=4, j=3
i=4, j=4
i=4, j=5
i=5, j=1
i=5, j=2
i=5, j=3
i=5, j=4
i=5, j=5
但是它有一個醜陋的case語句在中間,不靈活,因爲它可以。我希望能夠擴大它,而不必擴大案件陳述。
我嘗試這樣做:
for i in 1 2 3 4 5; do
for j in 1 2 3 4 5; do
$(p_${i})+=("$i, j=$j") # Does not work
${p_$i}+=("$i, j=$j") # neither does this
done
done
有一些語法魔力,讓我來動態定義和訪問數組的名字呢?任何幫助是極大的讚賞。
我試過 「michas」 的解決方案,如下所示:
#!/bin/bash
for i in 1 2 3 4 5; do
for j in 1 2 3 4 5; do
state=("i=$i, j=$j")
eval "p_$i+=($state)"
#also tried
# IFS="_" state=("i=$i,j=$j") #failed to show j=
# IFS="_" eval "p_$i=($state)" # failed to show j=
done
done
for i in {0..5}; do
for j in {0..5}; do
res=p_$i
eval "echo \$p_$i cooked: ${!res}"
#IFS="_" eval "echo \$p_$i cooked: ${!res}" #failed to show j=
done
done
但即使註釋掉地區,所有返回以下(有刪節)輸出:
i=1, cooked: i=1,
:
i=1, cooked: i=1,
i=1, cooked: i=1,
:
i=3, cooked: i=3,
i=3, cooked: i=3,
:
i=4, cooked: i=4,
i=4, cooked: i=4,
:
i=5, cooked: i=5,
i=5, cooked: i=5,
OK,解決了我問題。這個循環作爲第一個(仍然有限,但現在僅限於沒有「+」的字符串),但我可以喜歡這個。
#!/bin/bash
for i in 1 2 3 4 5; do
for j in 1 2 3 4 5; do
state=$(echo "i=$i, j=$j" | tr " " "+")
eval "p_$i+=($state)"
done
done
for i in {0..5}; do
for j in {0..5}; do
res=p_$i[$j]
eval "echo ${!res}"| tr '+' ' '
done
done
謝謝!
你是正確的,我應該有RTFM,但該解決方案沒有奏效。數組間分隔符的IFS設置似乎有問題。我還嘗試添加更改賦值爲:「IFS =」_「state =(」i = $ i,j = $ j「),並且也在eval命令中:例如IFS =」_「eval」p_ $ i =( $ state)「,無論我嘗試什麼,我都無法讓它顯示」j「設置。使用你的方法,似乎將數組元素分割在」「邊界上,謝謝。 – lcollado