我在编写包含Bash中变量字符串的命令时遇到了一些麻烦,想知道正确的方法。
我想尝试用数字1-9填充Row数组,但是在尝试传递变量Row $ Line [$ i] = $ i时遇到问题。
Row0=()
Row1=()
Row2=()
FillArrays() {
for Line in $(seq 0 2)
do
for i in $(seq 1 9)
do
Row$Line[$i]=$i
done
done
}
如果我回显命令,我可以得到期望的结果,但是我认为那仅仅是因为它是一个字符串。
我希望for循环选择每一行并在每个数组中添加数字1-9。
答案 0 :(得分:3)
FillArrays() {
for ((Line=0; Line<8; Line++)); do
declare -g -a "Row$Line" # Ensure that RowN exists as an array
declare -n currRow="Row$Line" # make currRow an alias for that array
for ((i=0; i<9; i++)); do # perform our inner loop...
currRow+=( "$i" ) # ...and populate the target array...
done
unset -n currRow # then clear the alias so it can be reassigned later.
done
}
参考文献:
for
循环答案 1 :(得分:0)
变量扩展发生得太晚了,以至于作业无法理解。您可以使用内置的declare
来延迟分配。函数中需要-g
才能使变量成为全局变量。
此外,您可能不想使用$Line
作为数组索引,而希望使用$i
,否则,您将不会使用数字1..9填充每个行数组。
#! /bin/bash
Row0=()
Row1=()
Row2=()
FillArrays() {
for Line in $(seq 0 8)
do
for i in $(seq 1 9)
do
declare -g Row$Line[$i]=$i
done
done
}
FillArrays
echo "${Row1[@]}"
但是请注意,将变量用作变量名的一部分是危险的。对我来说,需要这个总是意味着我需要从Shell切换到真正的编程语言。