无法理解这个 bash shell 参数扩展

无法理解这个 bash shell 参数扩展

对以下命令非常着迷:

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

相关内容