${array[*]} 和 ${array[@]} 有什么区别?什么时候使用其中一种而不是另一种?

${array[*]} 和 ${array[@]} 有什么区别?什么时候使用其中一种而不是另一种?

使用以下代码:

#! /bin/bash                         
                                     
declare -a arr=("element1"           
                "element2" "element3"
                "element4" )         
echo "1"                             
echo "${arr[@]}"                     
                                     
echo "2"                             
echo ${arr[*]}                       

输出是:

1
element1 element2 element3 element4
2
element1 element2 element3 element4

所以输出是一样的。

那么什么时候强制使用一种方法而不是另一种方法呢?

答案1

比较这三个循环的输出:

#!/bin/bash

declare -a arr=("this is" "a test" "of bash")

echo "LOOP 1"
for x in ${arr[*]}; do
  echo "item: $x"
done
echo

echo "LOOP 2"
for x in "${arr[*]}"; do
  echo "item: $x"
done
echo

echo "LOOP 3"
for x in "${arr[@]}"; do
  echo "item: $x"
done

上面的脚本将产生以下输出:

LOOP 1
item: this
item: is
item: a
item: test
item: of
item: bash

LOOP 2
item: this is a test of bash

LOOP 3
item: this is
item: a test
item: of bash

指某东西的用途"${array[@]}" 用双引号引起来保留数组中的项目,即使它们包含空格,而使用 或 会丢失该"${array[*]}"信息${array[*]}


手册页的“数组”部分对此进行了解释bash(1),其中表示:

可以使用 引用数组的任何元素${name[subscript]}。需要使用大括号以避免与路径名扩展发生冲突。如果下标是@*,则该词将扩展到 name 的所有成员。仅当单词出现在双引号内时,这些下标才会有所不同。如果单词用双引号引起来,则${name[*]}扩展为单个单词,每个数组成员的值由 IFS 特殊变量的第一个字符分隔,并将${name[@]}name 的每个元素扩展为单独的单词...

相关内容