$ IFS=";"
$ read first second
i am;a_i b c
$ echo $first
i am
$ echo $second
a_i b c
$ echo $IFS
- 내 말이 맞습니까? 이것은
read first second
현재 쉘 프로세스의 하위 프로세스입니까? 그렇다면 왜 필요하지 않습니까export IFS=";"
? - 왜 비어 있나요
IFS
?
답변1
내 말이 맞습니까? 읽은 첫 번째 순간은 현재 쉘 프로세스의 하위 프로세스입니까? 그렇다면 IFS=";"를 내보낼 필요가 없는 이유는 무엇입니까?
read
하나도 아니야배쉬 내장 함수. 여기서는 하위 쉘이나 하위 프로세스가 생성되지 않으므로 IFS
.
IFS가 비어 있는 이유는 무엇입니까?
큰따옴표를 사용하지 않았기 때문입니다. IFS 값을 로 변경했으므로 로 ;
확장 echo $IFS
하면 쉘은 단어 분할 및 와일드카드를 수행하기 위해 구분 기호로 사용됩니다. 그러면 아무것도 인쇄되지 않습니다.$IFS
;
;
노력하다:
$ IFS=";"
$ printf "%s\n" $IFS
$ printf "%s\n" "$IFS"
;
노트
답변2
입력하면 type read
을 얻습니다 read is a shell builtin
. 따라서 하위 프로세스로 실행되지 않습니다.
답변3
IFS가 비어 있는 이유를 답하십시오. 그렇지 않습니다. 그러나 그 가치는 IFS
쉘의 동작을 변경하는 데 있습니다. 다음은 설명이 아니라 Debian Gnu+Linux에서 bash를 사용한 실험 결과입니다.
a=";"; echo $a
생산하다 ;
.
IFS=";"; echo $IFS
빈 줄을 생성합니다.
IFS=";"; echo "$IFS"
생산하다 ;
.
이제 a=";"; echo $a
빈 줄이 생성되지만 IFS=" "; a=";"; echo $a
다시 ;
.
그래서
이제 IFS=";"; a=";"; echo $a
빈 줄을 생성 IFS=" "; a=";"; echo $a
하지만 ;
.
따라서 IFS 값은 동작을 변경합니다(그러면 에코에 따옴표를 사용하지 않음).
답변4
IFS=\;; set -- $IFS; echo $#; echo "$*"
1
;
IFS=; set -- $IFS; echo $#; echo "$*"
0
#there doesn't seem to be anything here
보시다시피 - $IFS
첫 번째 경우에는 비어 있지 않으며 필드 구분 기호만 포함되어 있습니다.
쉘이 인용되지 않은 변수를 확장할 때 에 정의된 구분 기호에 따라 해당 값을 분할합니다 $IFS
. 이렇게 하면 각 변수가 $IFS
별도의 배열이 될 수 있습니다. 기본적으로 $IFS
a <space>
, \t
ab 및 \n
ewline 으로 설정됩니다. 이들 각각은 특별한 $IFS
특성을 가지고 있습니다.$IFS
공백. $IFS
공백구분 기호는 유지되지 않으며, 쉘이 토큰화를 수행할 때 모든 시퀀스는 단일 필드로 잘리고 다른 모든 시퀀스에는 구분 기호당 하나의 필드가 있습니다.$IFS
공백또한 필드의 시작이나 끝에서도 완전히 제거됩니다. 예를 들어:
IFS=/; slashes=///////; printf '<%s>' $slashes
<><><><><><><>
IFS=' '; spaces=' '; printf '<%s>' $spaces
<>
printf '<%s>' $spaces$slashes
<///////>
하지만$IFS
공백확실히아니요삭제되면아니요존재하다 $IFS
:
IFS=/; printf '<%s>' $spaces$slashes
< ><><><><><><>