完全痴迷于以下命令:
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[*]}为什么在这种情况下,删除引号是有效的,与引号是无效的?
发布于 2021-02-26 17:10:18
"${partition_files[*]}"将所有数组元素连接到一个shell字,使用IFS的第一个字符作为合并器。因此,如果数组是a=("foo bar" asdf),而IFS具有默认值,则得到与"foo bar asdf"相同的值。
相反,您需要"${partition_files[@]}",它使每个元素成为一个不同的单词,因此与"foo bar" "asdf"相同。
这与"$@"和"$*"之间的区别是一样的,通常,除非您知道自己正在做一些特别的事情,否则您总是希望使用"$@"或"${array[@]}" (带有符号和引号)。
如果不使用引号进行${array[*]}操作,则可以分别获得所有元素,然后每个单词再次拆分。(如果IFS不是空字符串,它基本上与连接的所有元素相同,然后是组合字拆分。)
参见例如https://www.gnu.org/software/bash/manual/html_节点/特殊-Parameters.html
https://unix.stackexchange.com/questions/636590
复制相似问题