(如果我的英语不好,请提前道歉)
所以,我已经开始学习bash,并想在它做一个连接4游戏。然而,我有点卡住了。我有7个名为column0到column6的数组,我想稍后引用它们。
我在几天前的另一篇文章中读到,我可以使用nameef这样做,但我认为我做错了,因为函数运行,但不做任何事情(不检查获胜者)。下面是代码
的一个片段declare -n nr="column$j"
for ((j=0 ; j < 6; j++ )); do
if [ "${nr[0]}" = $k ] && [ "${nr[1]}" = $k ] && [ "${nr[2]}" = $k ] && [ "${nr[3]}" = $k ]; then
(这是检查获胜者的函数的一部分,如果一行中有4个字符匹配。'k'只是一个颜色变量,它可以是$k='Y'或$k='R')
谁能指出我在这里做错了什么?还是说我太蠢了,巴斯无法接受这样的解决方案?提前感谢您的帮助。考虑到您的规格,我试图重现一个最小的例子。
你可以试着这样做:
#!/usr/bin/env bash
k="Y"
nr_0=("R" "R" "Y" "Y")
nr_1=("R" "Y" "Y" "Y")
nr_2=("Y" "R" "Y" "Y")
nr_3=("Y" "Y" "R" "Y")
nr_4=("Y" "Y" "Y" "R")
nr_5=("Y" "Y" "Y" "Y") # the winner
nr_6=("Y" "R" "Y" "Y")
for j in {0..6}; do
tmp_array_name="nr_$j[@]"
tmp_array=("${!tmp_array_name}")
if [ "${tmp_array[0]}" == "$k" ] && [ "${tmp_array[1]}" == "$k" ] && [ "${tmp_array[2]}" == "$k" ] && [ "${tmp_array[3]}" == "$k" ]; then
echo "The winner is $tmp_array_name - ${tmp_array[*]}"
fi
done
The winner is nr_5[@] - Y Y Y Y
你需要在你的循环中声明nameef赋值,否则它会被分配一个空字符串:
for ((j=0 ; j < 6; j++ )); do
declare -n nr="column$j"
if [ "${nr[0]}" = $k ] && [ "${nr[1]}" = $k ] && [ "${nr[2]}" = $k ] && [ "${nr[3]}" = $k ]; then
另一个与动态命名${!dyn_name_var}
一样有风险的命名方法是使用Bash的关联数组:
declare -A grid=()
for ((column=0 ; j < 6; column++ )); do
if [ "${grid[$column,0]}" == "$k" ] &&
[ "${grid[$column,1]}" == "$k" ] &&
[ "${grid[$column,2]}" == "$k" ] &&
[ "${grid[$column,3]}" == "$k" ]
then
: ...
fi
: ...
done
这将使用一个关联数组的键列,形成的线。grid
关联数组的前两行静态声明示例
declare -A grid=(
[0,0]="o" [0,1]="x" [0,2]=" ", [0,3]="o"
[1,0]=" " [1,1]="o" [1,2]="x", [1,3]="o"
)
参见:如何在bash中声明2D数组