2014-03-03 6 views
0

리눅스 bash에서 IFS 문자열 분리 및 작은 따옴표 이스케이프에 관해 많은 질문이 있지만 두 항목을 합치는 사람이 없습니다. 문제에 장애물 나는 여기에 아래와 같은 코드로 이상한 (나에게) 동작을 가지고 :작은 따옴표로 IFS를 사용하는 리눅스 bash 문자열 분할

(bash는 스크립트 블록)

theString="a string with some 'single' quotes in it" 

old_IFS=$IFS 
IFS=\' 
read -a stringTokens <<< "$theString" 
IFS=$old_IFS 

for token in ${stringTokens[@]} 
do 
    echo $token 
done 

# let's say $i holds the piece of string between quotes 
echo ${stringTokens[$i]} 

무엇 발생하면 이의 -ed 요소를 에코이다 배열은 사실 \ ' IFS가 맞다고 생각하기에 앞서 에 대한 루프가 공백에 문자열 분할을 반환하는 동안 내가 필요한 하위 문자열을 포함합니다.

누군가 내게 같은 배열 (또는 마음 속에있는 배열이 같은 배열로 보이는 이유)을 이해하는 데 친절하게 도움이 될 수 있습니까?

답변

1

는 수행 할 때

for token in ${stringTokens[@]} 

루프 효과적으로된다 :

for token in a string with some single quotes in it 

그것이 의해 분리 된 문자열의 전체 출력을 분석 소자 현명한 배열을 분석하지 않고 루프하지만위한 공백

대신하려고 : 내 PC에

for token in "in a string with some " "single" " quotes in it" 

출력 :

for token in "${stringTokens[@]}"; 
do 
    echo "$token" 
done 

이 동등 할 것이다

a string with some 
single 
quotes in it 

확인 더 배쉬 함정이 아웃 : http://mywiki.wooledge.org/BashPitfalls