2016-10-31 3 views
0
pattern="::a::b::" 
oldIFS=$IFS 
IFS="::" 
read -r -a extractees <<< $pattern 
IFS=$oldIFS 

배쉬 - 빈 값

{"a","b"} 

을 초래하지만, 내가 인덱스를 유지하기 위해 필요한, 그래서 난 경우, 비교를 위해 (

{"","a","b",""} 

을 원하는 WITH 배열로 분할 문자열 I {"a","b"}을 원했을 때, "a::b"이라고 쓰여졌을 것입니다.

왜이 요소들이 위도 (다른 분리 문자로) 다시 나누면 빈 값은 빈 목록 이되고이되어야합니다.

어떻게해야합니까?

+0

@Cyrus "'{" ","b "," "}''- 내가 게시물 자체에 쓴 것처럼. ''{ "", "a", "", "b", "}}''''''''가 구분 기호 *이고 *이 인덱스를 변경하면 의미가 없습니다. – User1291

답변

1

필드 구분 기호가 1자를 초과 할 수 있습니다. 불행히도 '::' → ':'입니다.

그 외에도 인용 부호가없는 변수에서 잠재적 인 파일 이름 확장을 방지하기 위해 globbing을 명시 적으로 해제해야합니다.

set -f # disable globbing 
pattern=":a:b c:" 
oldIFS=$IFS 
IFS=":" 
extractees=($pattern) 
IFS=$oldIFS 

echo "'${extractees[0]}'" 
echo "'${extractees[1]}'" 
echo "'${extractees[2]}'" 
echo "'${extractees[3]}'" 
+0

인용 부호가없는 매개 변수 확장은 문자열을 배열로 분할하는 신뢰할 수있는 방법이 아닙니다. – chepner

+0

@chepner okay. '$ IFS'가 이미 설정되어 있으므로 따옴표로 묶지 않은 확장에 영향을 줄 수있는 유일한 방법은 파일 이름 덩어리입니다. 그러나 여기서는 발생하지 않습니다. 방금 BASH 4.3을 시도했습니다. 정확한 이유가 무엇인지 모르겠다.이 사건은 겉으로는 문서화되어 있지 않다. 하지만 안전면에서 globbing은'set -f'를 통해 명시 적으로 비활성화 할 수 있습니다. 편집 됨. – hidefromkgb

+0

@chepner 연속 공백 문자는'$ IFS'가 기본값과 같으면 _only_ 제거됩니다. [Prooflink] (http://www.tldp.org/LDP/abs/html/internalvariables.html#IFSH). – hidefromkgb