Bash에서 사용자 입력을 배열로 읽는 방법은 무엇입니까?


15

bash쉘 에서 사용자 입력을 배열로 읽는 방법은 무엇입니까?


stdin에서 읽고 싶다고 가정합니까? 내 대답은와 같은 실행에서도 작동 cat war_and_peace.txt | ./array_test.sh합니다.
Stefano Palazzo

또는 간단히 ./array_test.sh < war_and_peace.txt.
Eliah Kagan

답변:


14

이를 수행하는 한 가지 방법이 있습니다.

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

방금 실행하면 Ctrl + D (EOF)를 누를 때까지 표준 입력에서 계속 읽습니다. 나중에 입력 한 줄은입니다 my_array. 일부는이 코드가 혼동 될 수 있습니다. 루프의 본문은 기본적으로 말합니다 my_array = my_array + element.

흥미로운 문서들 :


3
read -r스테파노의 "읽기 내장 맨 페이지"링크는 그 목적을 설명합니다 (백 슬래시 해석을 방지하기 위해).
Peter.O

10

이것을 사용하여 읽으십시오 :

read -a arr

인쇄하려면 다음을 사용하십시오.

for elem in ${arr[@]}
do 
  echo $elem
done

4

그리고 매번 배열을 다시 생성하지 않는 것 (bash 3.1 이상이 필요하지만) :

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

자세한 내용은 http://mywiki.wooledge.org/BashFAQ/001 을 참조 하십시오 .

항상 버그를 작성하지 않으려면 http://mywiki.wooledge.org/BashGuide를 읽고 Advanced bash 스크립팅 안내서와 같은 tldp-guide를 피하십시오.


좋은 링크 ... IFS문제 를 지적 해 주셔서 감사합니다 . '읽기'는 널을 없애지 않고 앞뒤 공백을 모두 긁 -r습니다. 물론 물론 ...
Peter.O

0

이 하나의 라이너는 어떻습니까?)

arr=( $(cat -) )
echo ${arr[@]}

편집하다:

에서 bash,

arr=(val1 val2 ...)

배열할당 하는 방법입니다 . 이를 명령 대체와 함께 사용하면 파이프 라인에서 배열을 읽을 수 있으며이 방법을 사용 read하여이를 간단하게 수행 할 수는 없습니다 .

echo -e "a\nb" | read -a arr
echo ${arr[@]}

파이프 라인이 서브 쉘에서 실행될 수 있으므로 변수가 전혀 사용되지 않을 수 있기 때문에 파이프가 파이프 인 경우 read아무 것도 수행하지 않기 때문에 아무것도 출력 하지 않습니다stdin .

이 답변에서 제안한 방식을 사용하십시오.

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

그것은주는 a b방법으로 간단하고 직선 앞으로의 답변에 의해 주어진 어떤 해결 방법보다하는 파이프에서 쉘 변수로 읽기 값파이프 값을 설정하지 않는 한 후 bash는 읽을 .


테스트 했습니까?
cmak.fr

@ cmak.fr 예, 저에게 효과적입니다
Quark

@ Melabius 나는 그것에 대한 설명 과이 one-liner의 장점을 추가했습니다.
JiaHao Xu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.