Bourne / POSIX와 유사한 쉘에는 split + glob 연산자가 있으며 목록 컨텍스트에서 매개 변수 확장 ( $var
, $-
...), 명령 대체 ( $(...)
) 또는 산술 확장 ( $((...))
) 을 남겨 둘 때마다 호출됩니다 .
실제로, for name in ${array[@]}
대신 에 실수로 호출했습니다 for name in "${array[@]}"
. (실제로, 연산자를 실수로 호출하면 많은 버그와 보안 취약점이 생길 수 있습니다.)
해당 연산자는 $IFS
특수 매개 변수 (스플릿 할 문자를 알려주기 위해 (공백, 탭 및 개행은 특별한 처리를 받음)) 부품 -f
을 비활성화 ( set -f
) 또는 활성화 ( set +f
)하는 옵션으로 glob
구성됩니다.
또한 S
in $IFS
은 분리기 (POSIX 쉘 $IFS
) 에서 원래 ( S본인 Bourne 쉘 에서) 사용 되었지만 문자는 구분 기호 또는 종결$IFS
자로 표시되어야 합니다 (아래 예 참조).
분할 _
:
string='var1_var2_var3'
IFS=_ # delimit on _
set -f # disable the glob part
array=($string) # invoke the split+glob operator
for i in "${array[@]}"; do # loop over the array elements.
separator 와 delimiter 의 차이점을 보려면 다음을 시도하십시오.
string='var1_var2_'
그것은 그것을 ( var1
그리고 var2
여분의 빈 요소가 아닌) 로 나눌 것 입니다.
따라서 JavaScript와 비슷하게 만들려면 split()
추가 단계가 필요합니다.
string='var1_var2_var3'
IFS=_ # delimit on _
set -f # disable the glob part
temp=${string}_ # add an extra delimiter
array=($temp) # invoke the split+glob operator
(공백 은 JavaScript와 같이 1을 0이 아닌 ) 요소 $string
로 나눕니다 .split()
특수 처리 탭, 공백 및 개행 수신을 보려면 다음을 비교하십시오.
IFS=' '; string=' var1 var2 '
(당신은 얻을 곳 var1
과 var2
함께)
IFS='_'; string='_var1__var2__'
당신이 얻을 경우 : ''
, var1
, ''
, var2
, ''
.
참고 것을 zsh
쉘하지 않습니다 암시 같은 스플릿 + 글로브 운영자 호출되지 않는 이상 sh
또는 ksh
에뮬레이션. 거기에서 명시 적으로 호출해야합니다. $=string
분할 부분, $~string
glob 부분 ( $=~string
둘 다) 및 분리자를 지정할 수있는 split 연산자도 있습니다.
array=(${(s:_:)string})
또는 빈 요소를 보존하려면 :
array=("${(@s:_:)string}")
이 점에 유의 s
을위한 분할 하지 구분 (과 또한 $IFS
, 알려진 POSIX의 비 적합성 zsh
). split()
빈 문자열이 0이 아닌 1 요소로 분리된다는 점 에서 JavaScript와 다릅니다 .
에 주목할만한 차이 $IFS
-splitting은 즉 ${(s:abc:)string}
온 분할 abc
로하면서, 문자열 IFS=abc
, 그에 분할 것 a
, b
또는 c
.
로 zsh
하고 ksh93
, 공백, 탭 또는 개행 문자 수신하는 특별 대우는 그들을 두 배로하여 제거 할 수 있습니다 $IFS
.
역사적으로, Bourne 쉘 (조상 또는 현대 POSIX 쉘)은 항상 빈 요소를 제거했습니다. 또한 기본값이 아닌 값으로 $ @의 분할 및 확장과 관련된 많은 버그가있었습니다 $IFS
. 예를 IFS=_; set -f; set -- $@
들어와 같지 않습니다 IFS=_; set -f; set -- $1 $2 $3...
.
정규 표현식으로 나누기
이제 split()
정규 표현식으로 나눌 수있는 JavaScript에 더 가까운 무언가를 위해서는 외부 유틸리티를 사용해야합니다.
POSIX tool-chest awk
에는 확장 정규 표현식으로split
분할 할 수 있는 연산자가 있습니다 (JavaScript에서 지원하는 Perl과 유사한 정규 표현식의 하위 집합입니다).
split() {
awk -v q="'" '
function quote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
BEGIN {
n = split(ARGV[1], a, ARGV[2])
for (i = 1; i <= n; i++) printf " %s", quote(a[i])
exit
}' "$@"
}
string=a__b_+c
eval "array=($(split "$string" '[_+]+'))"
이 zsh
쉘은 Perl 호환 정규 표현식 ( zsh/pcre
모듈에서)을 기본적으로 지원 하지만 문자열을 분할하기 위해이를 사용하는 것은 비교적 번거 롭습니다.
shell
당신과 함께 사용하는bash
당신이 할 수있는IFS='_' read -a array <<< "${string}"