理解在 Bash 中声明数组的意义

理解在 Bash 中声明数组的意义

我试图理解在 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它不起作用。

相关内容