使用以下代码:
#! /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 的每个元素扩展为单独的单词...