![无法理解这个 bash shell 参数扩展](https://linux22.com/image/188701/%E6%97%A0%E6%B3%95%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%AA%20bash%20shell%20%E5%8F%82%E6%95%B0%E6%89%A9%E5%B1%95.png)
对以下命令非常着迷:
declare -a partition_files
readarray -d '' partition_files < <(find "$choosen_image_folder" -name "*sda${i}.gz*")
# this does not work
/bin/cat "${partition_files[*]}" | /bin/gunzip -f -c | ntfsclone -r -O "/dev/sda$i" -
# this does work
/bin/cat ${partition_files[*]} | /bin/gunzip -f -c | ntfsclone -r -O "/dev/sda$i" -
# this does not work
/usr/sbin/partimage restore -b "/dev/sda$i" "${partition_files[*]}"
# this does work
/usr/sbin/partimage restore -b "/dev/sda$i" ${partition_files[*]}
为什么在这种情况下删除引号有效,而使用引号则无效?
答案1
"${partition_files[*]}"
将所有数组元素连接到一shell 单词,使用第一个字符 ofIFS
作为连接符。因此,如果数组是a=("foo bar" asdf)
,并且IFS
具有默认值,则得到与 相同的结果"foo bar asdf"
。
相反,您希望"${partition_files[@]}"
它使每个元素成为不同的单词,因此与 相同"foo bar" "asdf"
。
"$@"
这与和之间的区别相同"$*"
,一般来说,您总是需要"$@"
, or "${array[@]}"
(带有 at 符号和引号),除非您知道您正在做一些特殊的事情。
如果${array[*]}
不使用引号,则会单独获取所有元素,然后再次拆分每个单词。 (如果IFS
不是空字符串,基本上和所有元素串联,然后组合分词一样。)
参见例如https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html