2016-09-30 2 views
-1

나는 요소의 배열을하고 난 같은 줄에 배열의 모든 요소를 ​​표시하려면 :스크립트 쉘을 사용하여 같은 줄에 많은 요소를 표시하는 방법은 무엇입니까?

i=0 
while read line 
do 
    array[$i]= echo $line | tr '[A-Z]' '.' 
    ((i+=1)) 
done 

k=0 
while [ $k -lt $i ] 
do 

    printf '%s ' ${array[$k]} 
    ((k+=1)) 
done 

이 프로그램의 결과가 나에게 나는 모든을 얻을 수 newline.How의 각 요소를 제공을 같은 줄에있는 요소는 공백으로 구분됩니까?

+4

[tag : csh]을 (를) 솔직하게 사용하십니까? 당신이 가지고있는 것은 bash와 다소 비슷해 보입니다. –

+0

두 번째'while' 루프는 실제로 첫 번째 루프가 배열을 올바르게 채웠다면 찾을 수 있습니다. 보고있는 출력은 첫 번째 루프에서 나오고 두 번째 루프에서는 나오지 않습니다. – chepner

답변

0

당신은 모든 것을 tr처럼 사용할 수 있습니다.

tr A-Z . | tr '\n' ' ' 

배열로 줄을 읽는 것은 배열을 재정렬하지 않으면 전혀 이해가되지 않습니다.

tr이 정규 표현식 인수를 읽지 않고 두 문자 범위 목록을 읽는 방법에 유의하십시오.

당신이 마지막 줄 바꿈을 유지 sed에 파이프를 복원하려면 다음과 sed 스크립트에 줄 바꿈을 포함

... | sed 's/ $/\n/' 

(표기법 완전히 휴대용 아니지만, 저는 믿습니다 이것은 합리적으로 현대적인 플랫폼에서 작동해야합니다.)

이러한 기본 파이프 라인은 모든 쉘에서 작동해야합니다. 귀하의 스크립트는 csh 스크립트처럼 보이지 않습니다. printf은 그랬지만 배열을 제대로 초기화하지 못했습니다 (루프가 불필요한 경우).

0

당신이 bash 4 이상을 사용하는 경우, 당신은 두 줄없이 외부 명령에 배열을 채울 수 있습니다 :

: bash 이전 버전의

readarray -t array 
array=("${array[@]//[A-Z]/.}") 

, 당신은 여전히 ​​루프가 필요합니다 어느 경우

while IFS= read -r line; do 
    array+=("${line//[A-Z]/.}") 
done 
, 당신은 그와 함께 한 줄에 배열의 요소를 인쇄 할 수 있습니다

printf '%s\n' "${array[*]}" 
관련 문제