Bash에서 별도의 줄에 배열 요소를 인쇄 하시겠습니까?


229

Bash 배열의 배열 요소를 별도의 줄에 어떻게 인쇄합니까? 이것은 작동하지만 분명히 더 좋은 방법이 있습니다.

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three

이것을 시도했지만 작동하지 않았습니다.

$ IFS=$'\n' echo ${my_array[*]}
one two three

답변:


436

이것을 시도하십시오 :

$ printf '%s\n' "${my_array[@]}"

의 차이 $@$*:

  • 인용되지 않은 결과는 지정되지 않습니다. Bash에서 둘 다 확장하여 args를 분리 한 다음 단어 분할 및 globbed를 수행합니다.

  • 인용 "$@"하면 각 요소를 별도의 인수로 "$*" 확장하고 하나의 인수로 병합 된 인수로 확장합니다 "$1c$2c..."(여기서 c첫 번째 문자는 IFS).

당신은 거의 항상 원합니다 "$@". 동일합니다 "${arr[@]}".

항상 인용하십시오!


5
내부 공간이있는 요소가 실수로 분리되지 않도록하려면 변수 참조 주위의 큰 따옴표가 중요합니다.
danfuzz

4
@sputnick : 작동하지 않습니다, 배열 요소는 한 줄로 끝납니다
Axel Bregnsbo

1
명령 후 두 개의 하이픈은 무엇입니까? 매뉴얼에서 이에 대한 언급을 찾지 못했습니다.
joanpau

3
배열에 요소가 없으면 빈 줄을 출력하지 않도록 만들 수 | grep -v '^$'있습니까?
Noel Yap

2
@espaciomore '% s \ n'은 printf 함수의 출력 형식입니다. % s는 문자열 인수 (이 경우 배열 요소)의 자리 표시자를 의미하며 \ n 뒤에 줄 바꿈을 추가합니다. 따라서 배열의 각 요소에 대한 출력에 문자열과 줄 바꿈이 있습니다.
Koja

71

반향 할 인수를 인용하십시오.

( IFS=$'\n'; echo "${my_array[*]}" )

하위 쉘은 사용 후 IFS 복원을 돕습니다.


3
죄송합니다. 'printf'기능에 대해 알게 되었기 때문에 솔루션을 더 좋아하지만 체크 표시를 스 푸트 닉으로 옮겼습니다.
Axel Bregnsbo

3
이 답변에 감사드립니다-좋아합니다! 확장 후 할당이 너무 잘못되어 IFS=$'\n' echo "${my_array[*]}"작동하지 않습니다. 오 잘!
cxw

@cxw, "할당이 발생했다"는 무슨 뜻입니까?
Steven Shaw

1
@bschlueter, Bash 4—4.4.23 (1) -release로 시도해 보았습니다.
Steven Shaw

1
@cxw 아, 나는 당신이 거기에서 무엇을하려고하는지 보지 못했습니다. echoBash에 내장되어 있기 때문에 작동하지 않는다고 생각합니다 . 그러나 함수로 감싸면 작동합니다! gist.github.com/steshaw/53ba0095bce8ccab52d26a14375dedb8
Steven Shaw

40

사용 을 위해 :

for each in "${alpha[@]}"
do
  echo "$each"
done

역사 사용하기 ; 값에 다음이 포함되어 있으면 실패합니다 !.

history -p "${alpha[@]}"

basename 사용 ; 값에 다음이 포함되어 있으면 실패합니다 /.

basename -a "${alpha[@]}"

shuf 사용 ; 결과가 순서대로 나오지 않을 수 있습니다.

shuf -e "${alpha[@]}"

19
"shuf"... "순서대로 나오지 않을 것"... 들썩 들썩.
Walf

4
shuf. 누가 그것을 사용하려고 생각했을까요?
fbicknel

3

나는 거대한 for ... if 루프에서 여기에 답을 시도했지만 아무런 기쁨도 얻지 못했습니다.

 # EXP_LIST2 is iterated    
 # imagine a for loop
     EXP_LIST="List item"    
     EXP_LIST2="$EXP_LIST2 \n $EXP_LIST"
 done 
 echo -e $EXP_LIST2

그것은 목록에 공백을 추가했지만 괜찮습니다-조금 들여 쓰기를 원했습니다. 또한 "\ n"이 원래 $ EP_LIST로 인쇄 될 수 있다고 가정합니다.


5
완전한 예처럼 보이지는 않습니다.
kenorb

3

또 다른 유용한 변형은 다음과 같은 파이프입니다 tr.

echo "${my_array[@]}" | tr ' ' '\n'

이것은 간단하고 컴팩트하게 보입니다.


11
이 점을 제외하고my_array=( "one two" three )
Mike Holt

큰 따옴표로 수정했습니다.
Steven Shaw

Bash 버전 4+ 에 광고 된대로 작동하지 echo "${my_array[@]}" | tr '' ' \n'않았지만 개인적으로 그렇게 사용하지 않는 것이 좋았습니다 echo. tr나의 선택은 tr '' ' \n' <<<"${my_array[@]}"나중에 읽기가 조금 더 쉽다고 생각합니다 .
S0AndS0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.