次のシェルスクリプト関数を考えてみましょう。
#!/bin/bash
declare -a dir
function() {
local -a directories=( "A/B/C D" "E/F G H" ) #Initialize local array.
printf "%q " "${directories[@]}" #"Return" values of array in escaped form.
}
dir=( $(funcion) )
for i in "${dir[@]}"; do
echo $i
done
コマンド置換がどのように機能するか:
dir=( A/B/C\ D E/F\ G\ H ) #Escape the whitespace.
スクリプトの結果は次のようになります。
A/B/C D
E/F G H
コマンドの置き換えが実際にどのように機能するか(結果のためにそう思います):
dir=( A/B/C\\ D E/F\\ G\\ H ) #Escape the backslash.
スクリプトの結果は次のとおりです。
A/B/C\
D
E/F\
G\
H
私のように動作させる方法はありませんか?
ベストアンサー1
私の考えでは、あなたは\n
これprintf
を持っています。
$ directories=( "A/B/C D" "E/F G H" )
$ printf "%q " "${directories[@]}"
これは以下を効果的に評価します。
$ printf "%q " "A/B/C D" "E/F G H"
A/B/C\ D E/F\ G\ H
これにより、forループが、、、およびを繰り返すことA/B/C\
になります。D
E/F\
G\
H
代わりに以下を使用する場合"%q\n"
:
$ printf "%q\n" "${directories[@]}"
A/B/C\ D
E/F\ G\ H
その後、次を使用して結果(から来ると仮定func
)を配列として読み取ることができます。
readarray -t dir < <(func)