2017-01-10 9 views
3

나는 배쉬 버전 4.2.25를 실행 중이다. 여기 내 코드는 다음과 같습니다.

#!/usr/bin/env bash 

string="one:two:three:four" 

# without quotes 
IFS=: read -ra array_1 <<< $string 
for i in "${array_1[@]}"; do printf "i = [$i]\n"; done 
# output: 
# i = [one two three four] 

# with quotes 
IFS=: read -ra array_2 <<< "$string" 
for i in "${array_2[@]}"; do printf "i = [$i]\n"; done 
# output: 
# i = [one] 
# i = [two] 
# i = [three] 
# i = [four] 

동작의 차이점은 무엇입니까?

답변

2

Linux에서 bash 4.2.46 및 bash 4.3.30을 사용하여 문제를 재현 할 수 없습니다.

변수가 실제로 공간에 분리되지 않기 때문에이 문제가 발생
string="one:two:three:four" 
IFS=: 

read -ra array_1 <<< $string 
for i in "${array_1[@]}"; do printf "i = [$i]\n"; done 
# i = [one two three four] 

read -ra array_2 <<< "$string" 
for i in "${array_2[@]}"; do printf "i = [$i]\n"; done 
# i = [one] 
# i = [two] 
# i = [three] 
# i = [four] 

, 그들이 $IFS에 분할하고 (이 공백, 탭 및 라인 피드 기본값) : 그러나, 여기에 설명 된 동작을 보여 않는 적응 버전입니다.

$IFS을 오버라이드 했으므로 콜론으로 값을 지정할 때주의해야합니다. 공백은 더 이상 중요하지 않습니다.

소스 코드는 write_here_string을 통해 호출되는 string_list의 배시 hardcodes a space을 보여줍니다. IFS에 공백이 포함되지 않은 경우 여러 단어로 확장되는 문자열은 비슷한 줄의 토큰으로 더 이상 read이 아니므로 차이가 더 두드러집니다.

추신 : 변수가 무엇인지 파악한 경우에도 변수를 항상 인용해야하는 이유의 좋은 예입니다.

1

이것은 버그처럼 보입니다. 나는 CHANGES을 통해 되돌아 보았지만 어떤 것도 발견 할 수 없었지만, cygwin bash 4.3.48 (8)에서는 인용 부호가 붙지 않고 인용 부호가 없으므로 예상 출력 (4 행)을 제공합니다. 언젠가 대역폭을 구울 때 repo을 복제하고 redir.c을 비난하여 관련 커밋을 찾을 수 있는지 확인하십시오.

+0

이것은 실제로 4.3에서 부분적으로 다루어지고 4.4에서 완성 된 (?) 버그입니다. – chepner