コマンド置換で配列に複数の値を割り当てる方法は?

コマンド置換で配列に複数の値を割り当てる方法は?

次のシェルスクリプト関数を考えてみましょう。

#!/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\になります。DE/F\G\H

代わりに以下を使用する場合"%q\n":

$ printf "%q\n" "${directories[@]}"
A/B/C\ D
E/F\ G\ H

その後、次を使用して結果(から来ると仮定func)を配列として読み取ることができます。

readarray -t dir < <(func)

おすすめ記事