このbashシェルパラメータ拡張は理解できません。

このbashシェルパラメータ拡張は理解できません。

次のコマンドにこだわります。

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[*]}"すべての配列要素を連結して一つシェル語の場合は、最初の文字をIFSコネクタとして使用します。したがって、配列がありa=("foo bar" asdf)IFS既定値を持つ場合は、"foo bar asdf"次の結果が得られます。

代わりに、"${partition_files[@]}"各要素を別の単語にして同じものにしたいと思います"foo bar" "asdf"

"$@"これはとの違いと同じです"$*"。通常、特別な作業を行っていることを知らない限り、常に、または"$@""${array[@]}"at記号と引用符を使用)が必要です。

引用符がない場合、${array[*]}すべての要素が個別にインポートされ、各単語が再分割されます。 (IFS空の文字列でない場合は、基本的にすべての要素を連結した後に単語分割を組み合わせるのと同じです。)

たとえば、参照してください。https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html

おすすめ記事