操作 bash 数组中的多个单词字符串

操作 bash 数组中的多个单词字符串

我有一个简单的脚本如下。

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 拆分空格上的所有元素(默认情况下),并另外对所有生成的单词执行文件名通配(这不是您使用的单词的问题)。在您的示例中,这将导致kalilinux被视为两个单独的词。

因此,使用

for name in "${names[@]}"; do
    printf '%s\n' "$name"
done

或者,对于这个简单的脚本,

printf '%s\n' "${names[@]}"

(不需要循环,因为printf将简单地为每个单独的参数重用其格式字符串)

有关的:

另外(为什么我总是使用printf它来输出变量字符串):

相关内容