필드 분할에 임시 IFS를 언제 사용할 수 있습니까?

무루

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필드 분할에 영향을 미칠 것으로 예상합니다 .

Gilles 'SO- 그만 사악함'

기본 아이디어는 when 실행 위해 VAR=VALUE some-command설정 VAR하는 것이 외부 명령이며 그보다 더 화려하지는 않습니다. 이 직관과 셸이 어떻게 작동하는지에 대한 지식을 결합하면 대부분의 경우 올바른 답을 찾아야합니다. POSIX 참조는 “Shell Command Language”장의“Simple Commands”입니다 .VALUEsome-commandsome-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$varIFS=. printf "%s\n" $varIFS$var

모든 유형의 명령을 다루었지만 실행할 명령이없는 경우, 즉 명령이 할당 (및 리디렉션 가능)으로 만 구성되는 경우 가 더 있습니다. 이 경우 할당은 그대로 유지됩니다 . VAR=VALUE OTHERVAR=OTHERVALUE와 동일합니다 VAR=VALUE; OTHERVAR=OTHERVALUE. 그래서 후 IFS=. arr=($var), IFS설정 상태로 유지됩니다 .. 이미 새 값이 있다는 기대 $IFSarr가지고에 할당에 사용할 수 있으므로 IFS의 확장에 의 새 값 이 사용되는 것이 합리적 입니다 $var.

요약하면, 당신은 사용할 수 있습니다 IFS에 대한 일시적 전용 필드 분할 :

  • 새 셸 또는 하위 셸을 시작하여 (예 : 값에 두 개 미만의 문자 포함 된 경우 다르게 동작한다는 점 third=$(IFS=.; set -f; set -- $var; echo "$3")third=${var#*.*.}제외하고 는 복잡한 방법입니다 .)var.
  • KSH에서와 IFS=. some-function여기서 some-functionKSH 구문으로 정의된다 function some-function …;
  • bash 및 zsh에서 IFS=. some-function호환 모드가 아닌 기본 모드에서 작동하는 한.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

언제 공개 필드를 사용할 수 있습니까?

분류에서Dev

필드 분할에서 IFS 문자를 "보호"할 수 있습니까?

분류에서Dev

언제 메소드를 사용할 수 있고 언제 명령 줄 옵션을 사용할 수 있습니까?

분류에서Dev

FreeBSD에서 OpenJDK 9를 언제 사용할 수 있습니까?

분류에서Dev

datetime 필드의 날짜 부분에 UNIQUE를 사용할 수 있습니까?

분류에서Dev

AWK에서 분할 된 필드를 어떻게 분할 할 수 있습니까?

분류에서Dev

언제 관계 / 역 참조를 사용할 수 있습니까?

분류에서Dev

Firestore 색인에서 필드를 제외 할 수 있습니까?

분류에서Dev

awk에서 필드를 삭제할 수 있습니까?

분류에서Dev

SQL에서 nvarchar (max) 필드를 제한 할 수 있습니까?

분류에서Dev

Google 시트의 IFS 함수 내에서 이진 연산자 OR, AND를 사용할 수 있습니까?

분류에서Dev

네임 스페이스를 사용하는 C #에서 시스템 선언을 생략 할 수 있습니까?

분류에서Dev

언 매니지드 스위치를 / 30에 사용할 수 있습니까?

분류에서Dev

"~"를 AWK 필드 구분자로 어떻게 사용할 수 있습니까?

분류에서Dev

FieldByFieldElementComparator를 사용하여 assertJ에서 일부 필드를 제외 할 수 있습니까?

분류에서Dev

Slurm에서 할당 된 노드를 언제 사용할 수 있는지 알 수있는 방법이 있습니까?

분류에서Dev

Akka를 사용하여 분산 시스템에서 웹 서비스 요청을 제한 할 수 있습니까?

분류에서Dev

Hibernate : 두 번째 레벨 캐시에 임시 필드를 저장할 수 있습니까?

분류에서Dev

Ubuntu 16.04 LTS에서 Landscape를 언제 사용할 수 있습니까?

분류에서Dev

개조 메서드 선언에 varargs를 사용할 수 있습니까?

분류에서Dev

레코드 세트에 AddNew를 사용할 때 필드 이름에 변수를 사용할 수 있습니까?

분류에서Dev

이미 필터링 된 시트에서 VBA 코드를 사용할 수 있습니까?

분류에서Dev

TCriticalSection 개체를 공용 클래스 필드로 선언 할 수 있습니까?

분류에서Dev

sprintf ()를 사용하여 라인 / 필드 크기를 제한 할 수있는 방법이 있습니까?

분류에서Dev

테스트에서 임베디드 루비를 사용할 수 있습니까?

분류에서Dev

함수 필드에서 부모를 어떻게 사용할 수 있습니까?

분류에서Dev

awk를 사용하여 빈 필드가있는 줄을 어떻게 삭제할 수 있습니까?

분류에서Dev

CppUnit을 임베디드 시스템에 사용할 수 있습니까?

분류에서Dev

런타임에 XmlRootAttribute에서 Namespace 필드를 설정할 수 있습니까?

Related 관련 기사

  1. 1

    언제 공개 필드를 사용할 수 있습니까?

  2. 2

    필드 분할에서 IFS 문자를 "보호"할 수 있습니까?

  3. 3

    언제 메소드를 사용할 수 있고 언제 명령 줄 옵션을 사용할 수 있습니까?

  4. 4

    FreeBSD에서 OpenJDK 9를 언제 사용할 수 있습니까?

  5. 5

    datetime 필드의 날짜 부분에 UNIQUE를 사용할 수 있습니까?

  6. 6

    AWK에서 분할 된 필드를 어떻게 분할 할 수 있습니까?

  7. 7

    언제 관계 / 역 참조를 사용할 수 있습니까?

  8. 8

    Firestore 색인에서 필드를 제외 할 수 있습니까?

  9. 9

    awk에서 필드를 삭제할 수 있습니까?

  10. 10

    SQL에서 nvarchar (max) 필드를 제한 할 수 있습니까?

  11. 11

    Google 시트의 IFS 함수 내에서 이진 연산자 OR, AND를 사용할 수 있습니까?

  12. 12

    네임 스페이스를 사용하는 C #에서 시스템 선언을 생략 할 수 있습니까?

  13. 13

    언 매니지드 스위치를 / 30에 사용할 수 있습니까?

  14. 14

    "~"를 AWK 필드 구분자로 어떻게 사용할 수 있습니까?

  15. 15

    FieldByFieldElementComparator를 사용하여 assertJ에서 일부 필드를 제외 할 수 있습니까?

  16. 16

    Slurm에서 할당 된 노드를 언제 사용할 수 있는지 알 수있는 방법이 있습니까?

  17. 17

    Akka를 사용하여 분산 시스템에서 웹 서비스 요청을 제한 할 수 있습니까?

  18. 18

    Hibernate : 두 번째 레벨 캐시에 임시 필드를 저장할 수 있습니까?

  19. 19

    Ubuntu 16.04 LTS에서 Landscape를 언제 사용할 수 있습니까?

  20. 20

    개조 메서드 선언에 varargs를 사용할 수 있습니까?

  21. 21

    레코드 세트에 AddNew를 사용할 때 필드 이름에 변수를 사용할 수 있습니까?

  22. 22

    이미 필터링 된 시트에서 VBA 코드를 사용할 수 있습니까?

  23. 23

    TCriticalSection 개체를 공용 클래스 필드로 선언 할 수 있습니까?

  24. 24

    sprintf ()를 사용하여 라인 / 필드 크기를 제한 할 수있는 방법이 있습니까?

  25. 25

    테스트에서 임베디드 루비를 사용할 수 있습니까?

  26. 26

    함수 필드에서 부모를 어떻게 사용할 수 있습니까?

  27. 27

    awk를 사용하여 빈 필드가있는 줄을 어떻게 삭제할 수 있습니까?

  28. 28

    CppUnit을 임베디드 시스템에 사용할 수 있습니까?

  29. 29

    런타임에 XmlRootAttribute에서 Namespace 필드를 설정할 수 있습니까?

뜨겁다태그

보관