bash for 루프의 예기치 않은 필드 확장 동작

bash for 루프의 예기치 않은 필드 확장 동작

Linux/Unix에서 모든 필드 확장 규칙을 조정하는 데 어려움을 겪고 있어 실험을 해왔습니다. 다음은 내가 예상한 것과 일치하지 않는 내 읽기를 기반으로 한 예입니다.

~$ IFS=$', \t\n'
~$ for i in 1 2 3; do echo num:"$i"; done
num:1
num:2
num:3
~$ myvar=1,2,3
~$ for i in $myvar; do echo num:"$i"; done
num:1
num:2
num:3
~$ for i in 1,2,3; do echo num:"$i"; done
num:1,2,3

최종 결과는 나에게 전혀 예상치 못한 일이었습니다. 변수의 루프에 대한 bash 내에서만 필드 확장이 발생한다는 규칙을 어디서 찾을 수 있습니까?

IFSbash for 루프가 처음에 설정한 값을 존중하지 않는 것 같습니다 . 제가 뭔가 잘못 이해한 걸까요?

답변1

필드 분할리터럴 문자열이 아닌 큰따옴표 안에 표시되지 않는 매개변수 확장, 명령 대체 및 산술 확장의 결과에만 적용됩니다.

를 사용하면 $myvar다음과 같은 효과를 얻을 수 있습니다 glob(split(1,2,3)): , 반환 에 포함 split(1,2,3)포함 , 및 반환 및 .,IFS123glob(1 2 3)123

리터럴 문자열은 1,2,3이 프로세스의 영향을 받지 않으며 단순히 변경되지 않고 반환됩니다.

답변2

다음 명령을 실행하십시오.

LESS=+/'^ *IFS *The' man bash

읽기("강조 광산"):


단어 분할에 사용되는 IFS 내부 필드 구분 기호확장 후그리고 read 내장 명령을 사용하여 행을 단어로 분할합니다. 기본값은 입니다 `<space><tab><newline>'.

이는 확장이 발생하지 않으면 IFS 필드 분할도 발생하지 않음을 의미합니다.

실제로 분할은 원래 줄에서 발생하지만 고정된 메타 문자 집합을 사용하여 발생합니다.| & ; ( ) < > space tab

쉼표 ,는 메타 문자가 아니며 구분하는 데 사용되지 않습니다.

이것이 책의 7장명령줄 처리에 대한 자세한 내용:

  1. 명령을 고정된 메타 문자 집합(SPACE, TAB, NEWLINE, ;, (,), <, >, | 및 &)으로 구분된 토큰으로 분할합니다. 토큰 유형에는 단어, 키워드, I/O 리디렉터 및 세미콜론이 포함됩니다.

  1. 인수, 명령 및 산술 치환으로 인한 줄 부분을 가져와서 다시 단어로 나눕니다. 이번에는 1단계에서 설정한 메타 문자 대신 $IFS의 문자를 구분 기호로 사용합니다.

관련 정보