`echo` 및 `for`를 사용한 POSIX 필드 분할 및 큰따옴표 동작

`echo` 및 `for`를 사용한 POSIX 필드 분할 및 큰따옴표 동작

POSIX 표준에 따르면필드 분할,큰따옴표,게다가for 루프echo "$s"아래 예에서는 큰따옴표를 사용하면 숫자 사이에 새 줄이 표시되지만 큰따옴표를 사용하면 for x in "$s"숫자 사이에 새 줄이 표시되지 않는 이유를 이해할 수 없습니다 . 누군가 이것을 명확히 할 수 있습니까?

$ s=$(seq 1 4)
$ echo $s
1 2 3 4
$ echo "$s"
1
2
3
4
$ for x in $s; do echo $x; done
1
2
3
4
$ for x in "$s"; do echo $x; done
1 2 3 4

답변1

올바르게 언급했듯이 IFS(필드 분할) 환경 변수는 여기서 중요한 역할을 합니다. 일반적으로 IFS설정에는 <space>, <tab><newline>문자가 포함됩니다. 즉, 변수에 따옴표가 사용되지 않으면 쉘 인터프리터는 IFS가능할 때마다 변수를 값별로 별도의 인수로 분리합니다(여러 IFS문자를 압축하더라도).

따라서 변수에는 s다음 값이 항상 존재합니다. 나머지는 해석에 달려있습니다.

1<newline>2<newline>3<newline>4

첫 번째에서는 for쉘이 실행되기 전에 루프를 4번 $s분할 하고 실행합니다. for다음의 경우 echo분할할 항목이 없으므로 각 요소가 한 줄에 인쇄됩니다(이것이 완료되었습니다 echo).

위에서 언급했듯이 두 번째는 for전체 값에 대해 한 번만 실행됩니다. s지금 일어나고 있는 일은 쉘이 변수를 전달하기 전에 변수를 분리한다는 것입니다 s(큰따옴표가 없기 때문입니다). 즉, 문자는 관련성이 없게 되며 각 숫자는 단지 매개변수일 뿐입니다. 여러 매개변수를 가져올 때 공백 문자로 구분하여 동일한 순서로 인쇄합니다.IFSechox<newline>echo

관련 정보