2017-12-31 56 views
1

나는 사용하여 파일에서 입력을 읽고 :

declare -a ARR  
    readarray -t ARR < <(cat /etc/passwd | tr "\n" "\n") 

이 잘 그것을 인쇄,하지만 각 행에 액세스하려면 :

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

이 공간의 입력 분할된다

for i in ${ARR[@]}; do 
     echo ${i} 
    done 

echo에 올바르게 인쇄하려면 특별한 옵션이 필요합니까? this answer을 기준으로 echo "${i}"으로 변경하면 문제가 해결되지만 수정되지는 않습니다. 이 같은 문제가 있습니다

printf "${i} \n" 
+2

'tr "은 무엇인가요? \ n" "\ n" –

답변

2

공백에 대한 분할을 방지하려면를 대체 :

for i in ${ARR[@]}; do 

으로 :

for i in "${ARR[@]}"; do 

을 큰 따옴표가 없으면, 쉘은 단어 분리를 수행 .

echo ${i}echo "${i}"으로 대체하는 것이 가장 좋습니다. 큰 따옴표가 없으면 ${i}은 단어 분리 (여러 공백이 하나의 공백으로 축소됨) 및 경로 이름 확장 (쉘 활성 문자가있는 단어가 현재의 파일 이름으로 대체 될 수 있음) 예배 규칙서).

+1

대부분의 변수/배열/명령 확장은 큰 따옴표로 묶어야합니다. 큰 따옴표를 사용하지 않는 것이 안전 할 수도 있지만 IMO에서는 항상 큰 따옴표를 사용하는 것보다 안전한 곳을 추적하는 것이 더 어렵습니다. –

+0

큰 따옴표 안에'$ {ARR [*]} "'은'$ IFS'의 첫 문자를 구분 기호로 사용합니다. – cdarke