区切り文字としてスペースを含む文字列があると仮定します。
newline_separated=${space_separated// /$'\n'}
ただし、おそらく間違った質問をしているのでしょう。(必ずしもそうではありません。たとえば、これはメイクファイルに表示される可能性があります。)ファイル名のスペースで区切られたリストは実際には機能しません。
プログラムがファイル名を引数として受け取る場合、それらをスペースで結合しないでください。"$@"
それらを1つずつアクセスするために使用します。が、echo "$@"
プリントの間にスペースを持つ引数が、それはのためにありますecho
:それは区切りとしてスペースでその引数を出力します。somecommand "$@"
ファイル名を個別の引数としてコマンドに渡します。引数を別々の行に出力したい場合は、使用できます
printf '%s\n' "$@"
スペースで区切られたファイル名があり、それらを処理するために配列に入れたい場合は、引用符なしの変数展開を使用して、値を文字で分割IFS
できます(ワイルドカード展開を無効にする必要がありますset -f
、そうでなければglobパターンは値で展開されます):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
これを、-f
設定と設定IFS
完了時の値を復元する関数にカプセル化できます。
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …