我试图理解在 bash 中明确声明数组的意义。我正在学习的课程指出,您应该使用以下命令创建数组:
$ declare -a ARRAYNAME
我实际上从来不知道这个命令,因为我从来没有这样处理过数组。例如,我写了下面的脚本,然后删除了文件的第一行。结果是相同的。这引出了一个问题,什么是實際點曾经使用过这个“$declare -a”语句,因为我的课程指出,显然这个声明语句必须被使用(事实证明我错了)?
$ cat test6
declare -a car_models
car_models=( honda toyota bmw )
for i in "${!car_models[@]}"
do
echo " $i ${car_models[$i]}"
done
答案1
我不知道你为什么会有除了代码的清晰度和可读性之外,声明它还可以清楚地表明下一个阅读代码的人“嘿,这个变量将保存一个索引数组”。
另一方面,声明联想数组确实很有用。考虑这个例子:
#!/bin/bash
for i in {a..c}; do
badArray[$i]="foo $i"
done
declare -A goodArray
for i in {a..c}; do
goodArray[$i]="foo $i"
done
for i in {a..d}; do
printf 'badArray value for key "%s" is: %s, goodArray value is: %s\n' \
"$i" "${badArray[$i]}" "${goodArray[$i]}"
done
echo "BAD: ${badArray[@]}"
echo "BAD: ${goodArray[@]}"
运行结果为:
$ foo.sh
badArray value for key "a" is: foo d, goodArray value is: foo a
badArray value for key "b" is: foo d, goodArray value is: foo b
badArray value for key "c" is: foo d, goodArray value is: foo c
badArray value for key "d" is: foo d, goodArray value is: foo d
BAD: foo c
BAD: foo c foo b foo a
如您所见,与常规索引数组不同,如果您不将数组声明为关联数组,则declare -A
它不起作用。