もしそうinner.sh
なら
#...
echo first
echo second
echo third
そしてouter.sh
、
var=`./inner.sh`
# only wants to use "first"...
空白でどのvar
ように分割できますか?
もしそうinner.sh
なら
#...
echo first
echo second
echo third
そしてouter.sh
、
var=`./inner.sh`
# only wants to use "first"...
空白でどのvar
ように分割できますか?
これを試して:
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
が別々の行に出力されます。を二重引用符で囲んでいないので$(...)
、それらは同じ行にまとめられますが、スペースで区切られているため、前の箇条書きのようになります。ビルトインを忘れないでください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)
空白ではなく、改行で分割しています。これを試してみてください:
IFS=$'
'
var=$(./echo.sh)
echo $var | awk '{ print $1 }'
unset IFS