我有一个简单的脚本如下。
names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
echo "names array length: ${#names[@]}"
for n in ${names[@]}; do
echo $n
done
我的意图和希望得到的是:
names array length: 5
windows
ubuntu
raspbian
debian
kali linux
但我得到的结果是:
names array length: 5
windows
ubuntu
raspbian
debian
kali
linux
该数组似乎具有正确的条目数,但打印输出出现在 6 行而不是 5 行。我怎样才能获得所需的输出?
答案1
双引号变量扩展${names[@]}
将使其扩展为数组的元素,单独引用。不引用变量扩展将使 shell 拆分空格上的所有元素(默认情况下),并另外对所有生成的单词执行文件名通配(这不是您使用的单词的问题)。在您的示例中,这将导致kali
和linux
被视为两个单独的词。
因此,使用
for name in "${names[@]}"; do
printf '%s\n' "$name"
done
或者,对于这个简单的脚本,
printf '%s\n' "${names[@]}"
(不需要循环,因为printf
将简单地为每个单独的参数重用其格式字符串)
有关的:
另外(为什么我总是使用printf
它来输出变量字符串):