bash에서라고 말하면 var=a.b.c.
다음과 같습니다.
$ IFS=. printf "%s\n" $var
a.b.c
그러나 이러한 사용법은 IFS
배열을 만드는 동안 적용됩니다.
$ IFS=. arr=($var)
$ printf "%s\n" "${arr[@]}"
a
b
c
이것은 매우 편리하고 확실하지만 어디에 문서화되어 있습니까? Bash 문서에서 Arrays 또는 Word Splitting 에 대한 섹션을 빠르게 읽으면 어느 쪽도 표시되지 않습니다. 단일 페이지 문서IFS
를 검색 해도이 효과에 대한 힌트를 제공하지 않습니다.
언제 안정적으로 할 수 있는지 잘 모르겠습니다.
IFS=x do something
그리고 이것이 IFS
필드 분할에 영향을 미칠 것으로 예상합니다 .
기본 아이디어는 when 실행 을 위해 VAR=VALUE some-command
설정 VAR
하는 것이 외부 명령이며 그보다 더 화려하지는 않습니다. 이 직관과 셸이 어떻게 작동하는지에 대한 지식을 결합하면 대부분의 경우 올바른 답을 찾아야합니다. POSIX 참조는 “Shell Command Language”장의“Simple Commands”입니다 .VALUE
some-command
some-command
경우 some-command
입니다 외부 명령 , VAR=VALUE some-command
동일합니다 env VAR=VALUE some-command
. VAR
의 환경에서 내보내지고 some-command
셸의 값 (또는 값 부족)은 변경되지 않습니다.
some-command
이 함수 인 경우 VAR=VALUE some-command
는와 동일합니다 VAR=VALUE; some-command
. 즉 , 함수가 반환 된 후에도 할당이 그대로 유지되고 변수가 환경으로 내보내지지 않습니다. 그 이유는 Bourne 쉘의 설계와 관련이 있습니다 (이후 이전 버전과의 호환성이 있음). 함수 실행과 관련된 변수 값을 저장하고 복원 할 수있는 기능이 없었습니다. 변수를 내 보내지 않는 것은 함수가 쉘 자체에서 실행되기 때문에 의미가 있습니다. 그러나 ksh (ATT ksh93 및 pdksh / mksh 포함), bash 및 zsh VAR
는 함수 실행 중에 만 설정 되는보다 유용한 동작을 구현합니다 (내보내기도 함). ksh 에서는 함수가 ksh 구문으로 정의 된 경우 수행됩니다.function NAME …
, 표준 구문으로 정의 된 경우가 아닙니다 NAME ()
. bash 에서는 POSIX 모드가 아닌 bash 모드에서만 수행됩니다 (로 실행될 때 POSIXLY_CORRECT=1
). zsh 에서는 posix_builtins
옵션이 설정되지 않은 경우 수행됩니다 . 이 옵션은 기본적으로 설정되어 있지 않지만 emulate sh
또는 로 설정됩니다 emulate ksh
.
경우 some-command
내장 명령이 동작은 내장의 유형에 따라 달라집니다. 특수 내장 기능은 함수처럼 작동합니다. 특수 내장 기능은 상태 쉘에 영향을 미치기 때문에 쉘 내부에서 구현되어야하는 것들입니다 (예 : break
제어 흐름에 cd
영향을 미치고 현재 디렉토리에 set
영향을 미치고 위치 매개 변수 및 옵션에 영향을 미칩니다…). 다른 내장 기능 은 성능과 편의를 위해서만 내장 되어 있으며 (대부분 — 예를 들어 bash 기능 printf -v
은 내장 기능에 의해서만 구현 될 수 있음) 외부 명령처럼 작동합니다.
할당은 별칭 확장 후에 발생하므로 some-command
가 별칭 인 경우 먼저 확장하여 어떤 일이 발생하는지 확인하십시오.
모든 경우에 명령 줄 자체의 변수 대체를 포함하여 명령 줄이 구문 분석 된 후에 할당이 수행됩니다. 따라서 는 할당이 발생하기 전에 평가되기 때문에를 var=a; var=b echo $var
인쇄합니다 . 따라서 이전 값을 사용하여 .a
$var
IFS=. printf "%s\n" $var
IFS
$var
모든 유형의 명령을 다루었지만 실행할 명령이없는 경우, 즉 명령이 할당 (및 리디렉션 가능)으로 만 구성되는 경우 가 더 있습니다. 이 경우 할당은 그대로 유지됩니다 . VAR=VALUE OTHERVAR=OTHERVALUE
와 동일합니다 VAR=VALUE; OTHERVAR=OTHERVALUE
. 그래서 후 IFS=. arr=($var)
, IFS
설정 상태로 유지됩니다 .
. 이미 새 값이 있다는 기대 $IFS
를 arr
가지고에 할당에 사용할 수 있으므로 IFS
의 확장에 의 새 값 이 사용되는 것이 합리적 입니다 $var
.
요약하면, 당신은 사용할 수 있습니다 IFS
에 대한 일시적 전용 필드 분할 :
third=$(IFS=.; set -f; set -- $var; echo "$3")
을 third=${var#*.*.}
제외하고 는 복잡한 방법입니다 .)var
.
IFS=. some-function
여기서 some-function
KSH 구문으로 정의된다 function some-function …
;IFS=. some-function
호환 모드가 아닌 기본 모드에서 작동하는 한.이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다