86

もしそうinner.shなら

#...
echo first
echo second
echo third

そしてouter.sh

var=`./inner.sh`
# only wants to use "first"...  

空白でどのvarように分割できますか?

4

3 に答える 3

132

これを試して:

var=($(./inner.sh))

# And then test the array with:

echo ${var[0]}
echo ${var[1]}
echo ${var[2]}

出力:

first
second
third

説明:

  • var=(first second third)たとえば、 を実行して、bash で配列を作成できます。
  • $(./inner.sh)inner.shスクリプトを実行するとfirst、 、second、およびthirdが別々の行に出力されます。を二重引用符で囲んでいないので$(...)、それらは同じ行にまとめられますが、スペースで区切られているため、前の箇条書きのようになります。
于 2012-12-11T16:21:34.463 に答える
55

ビルトインを忘れないでくださいmapfile。あなたのケースでは間違いなく最も効率的です:ファイル全体を配列に丸呑みしたい場合、そのフィールドは によって出力される行になり./inner.shます。

mapfile -t array < <(./inner.sh)

次に${array[0]}、などの最初の行が表示されます...

このビルトインと可能なすべてのオプションの詳細については、次を参照してください。

help mapfile

という変数の最初の行だけが必要な場合はfirstline

read -r firstline < <(./inner.sh)

これらは間違いなく最も効率的な方法です。

この小さなベンチマークはそれを証明します:

$ time mapfile -t array < <(for i in {0..100000}; do echo "fdjsakfjds$i"; done)

real    0m1.514s
user    0m1.492s
sys 0m0.560s
$ time array=( $(for i in {0..100000}; do echo "fdjsakfjds$i"; done) )

real    0m2.045s
user    0m1.844s
sys 0m0.308s

によって出力された最初の行の最初の単語(スペース区切り付き)のみが必要な場合./inner.sh、最も効率的な方法は次のとおりです。

read firstword _ < <(./inner.sh)
于 2012-12-11T17:40:24.990 に答える
9

空白ではなく、改行で分割しています。これを試してみてください:

IFS=$'
'

var=$(./echo.sh)
echo $var | awk '{ print $1 }'
unset IFS
于 2012-12-11T16:22:47.493 に答える