在 bash 数组中操作多个字串

0 bash array

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

names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
echo "names array length: ${#names[@]}"

for n in ${names[@]}; do
    echo $n
done
Run Code Online (Sandbox Code Playgroud)

我的意图和希望是:

names array length: 5
windows
ubuntu
raspbian
debian
kali linux
Run Code Online (Sandbox Code Playgroud)

但我得到的结果是:

names array length: 5
windows
ubuntu
raspbian
debian
kali
linux
Run Code Online (Sandbox Code Playgroud)

该数组似乎具有正确的条目数,但打印输出出现在 6 行而不是 5 行上。我怎样才能获得所需的输出?

Kus*_*nda 5

双引号变量扩展${names[@]}将使其扩展到数组的元素,单独引用。不引用该变量扩展将使 shell 将所有元素拆分为空格(默认情况下),并另外对所有生成的单词执行文件名通配(不是您使用的单词的问题)。在您的示例中,这会导致kali和linux被视为两个单独的词。

因此,使用

for name in "${names[@]}"; do
    printf '%s\n' "$name"
done
Run Code Online (Sandbox Code Playgroud)

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

printf '%s\n' "${names[@]}"
Run Code Online (Sandbox Code Playgroud)

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

有关的:

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