フィールド間のセパレータである IFS の設定を変更すると、表示される結果に近づくことができます。
$ set -- "/abc/def/ghi" "jkl" "mno pqr/stu vwx"
$ print "%s\n" "$@"
abc/def/ghi
jkl
mno pqr/stu vwx
$ echo "$@"
abc/def/ghi jkl mno pqr/stu vwx
$ IFS=/
$ echo $@
abc def ghi jkl mno pqr stu vwx
$ IFS=$' \t\n'
$
これは単語を一緒に実行しませんが、スラッシュを失います。問題をより正確に診断するには、スクリプト内により多くのコードを提供する必要があります。
スラッシュが消える問題とは別に、引数を保存する必要がある場合は、実際に次を使用する必要があります。
args=("$@")
これにより、ファイル名が配列に保存され、名前が分離され、スペースが正しく処理されます。その後、0 から始まるインデックスを使用して個別のファイル名にアクセスできます。
echo "${args[1]}"
echo "${args[@]}"
for file in "${args[@]}"; do ...; done
質問で使用される表記は次のとおりです。
args=$*
args=$@
これらはどちらも、元の名前をスペースで区切った単一の文字列にファイル名を保存します。元のファイル名にスペースが含まれている場合、これを元のファイル名に確実に分割することはできません。ほとんどの場合、これはあなたが望むものではありません。