コマンド置換でパラメータを使用するときのトークン化

コマンド置換でパラメータを使用するときのトークン化

コマンド置換に使用するときにスペースを含む引数が正しく処理されるようにするにはどうすればよいですか?おそらく説明する例があります。

$ file="/home/1_cr/xy z"
$ basename $file
xy

$ #need to pass basename a quoted $file to prevent the z in 'xy z' from being eaten
$ basename "$file"
xy z

$ #Now using $file inside a command substitution without quoting.....
$ #....the command substitution causes 'xy z' to split
$ set -- $(basename "$file")
$ printf "%s\n" "$@"
xy
z

$ #But quoting the command substitution does not prevent 'xy z'...... 
$ #....from being split before being passed to basename
$ set -- "$(basename $file)"
$ printf "%s\n" "$@"
xy

私は何をすべきか

$ set -- $(basename $file)
$ printf "%s\n" "$@"

生産する

xy z   

ベストアンサー1

すべての変数とコマンドの置換には二重引用符を入れる必要があります。

set -- "$(basename -- "$file")"

変数の値を単語に分割し、その単語をグローバルパターンとして処理すると、元に戻すことはできません。空白がいくつあるのか、ファイル名がワイルドカード拡張の結果であるのかはわかりません。ハンバーガーを牛に戻すことはできないので、まず牛を屠殺場に送らないようにしなければなりません。

おすすめ記事