BASH 스크립트: 명령 출력의 각 줄을 배열의 값에 할당하는 방법은 무엇입니까?

BASH 스크립트: 명령 출력의 각 줄을 배열의 값에 할당하는 방법은 무엇입니까?

명령을 실행하면 10줄의 출력이 표시됩니다. 2-4-6-8-10 행을 배열에 넣고 싶습니다.

명령을 실행할 때마다 순서가 바뀌기 때문에 한 번에 해야 합니다. 명령을 실행하고 2번째 줄을 선택한 다음 다시 실행하고 4번째 줄을 선택하는 등의 방법을 시도했지만 순서가 변경되었기 때문에 작동하지 않습니다.

value1=$(my_command |sed '2q;d')
value2=$(my_command |sed '4q;d')
value3=$(my_command |sed '6q;d')
value4=$(my_command |sed '8q;d')
value5=$(my_command |sed '10q;d')

MY_ARRAY=("${value1}" "${value2}" "${value3}" "${value4}" "${value5}")

답변1

readarraybash쉘 및 GNU 에서 사용 sed:

readarray -t my_array < <( my_command | sed '1~2d' )

내장 함수는 readarray행을 배열로 읽어 들입니다. 이 줄은 프로세스 대체에서 읽혀집니다. 프로세스 대체 명령은 읽은 (또는 쓰여진 또는 표준으로 ) sed한 줄씩 걸러서만 출력합니다 .my_commandsed '1!n;d'sed -n 'n;p'sed

GNU에서 이 주소는 sedline에서 시작하는 각 줄을 n~m지정합니다 . 편의상 이는 표준에 대한 GNU 확장입니다.mnsed

my_command명령은 한 번만 호출됩니다.

시험:

$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10

관련 정보