IT story

Bash에서 여러 줄 출력을 배열로 캡처

hot-time 2021. 1. 6. 20:21
반응형

Bash에서 여러 줄 출력을 배열로 캡처


이 질문에 이미 답변이 있습니다.

만약 inner.shIS

#...
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

참조 URL : https://stackoverflow.com/questions/13823706/capture-multiline-output-as-array-in-bash

반응형