~에서https://unix.stackexchange.com/a/458074/674
산술 확장은 또한 분할+glob의 영향을 받으므로 따옴표로 묶어야 합니다(shift "$((OPTIND - 1))")(환경에서 $IFS를 상속하지 않는 bash를 사용하고 있으므로 여기서는 문제가 되지 않습니다. 스크립트 앞부분에서 IFS를 수정하지 않지만 여전히 좋은 습관입니다.
산술 확장이 IFS와 어떻게든 관련되어 있습니까?
답변1
다른 산술 확장과 마찬가지로 따옴표가 없는 산술 확장의 결과는 파일 이름 와일드카드(와일드카드 확장) 및 단어(필드) 분할을 거칩니다.인용되지 않은 확장. 꽤 쓸모가 없고 일부 쉘에서는 이를 수행하지 않지만, 이것이 역사적 쉘이 수행한 작업이므로(구현하기가 더 쉽기 때문에) 이것이 POSIX가 표준화한 것입니다.
산술 확장의 결과는 단지 문자열 -
과 숫자이므로 와일드카드 문자를 포함할 수 없습니다. (일부 쉘에는 부동 소수점이 있으며 , 및 문자도 포함될 수 있습니다 .
. +
) 공백을 포함할 수 없으므로 일반적으로 필드 분할의 영향을 받지 않습니다. 그러나 필드 분할은 다음과 같은 방법으로 구성할 수 있습니다 IFS
. 필드 구분 기호는 문자입니다 IFS
. 숫자를 포함하는 것은 IFS
극히 드물고 매우 어리석은 일이지만, 완전히 강력한 코드를 작성하려면 이를 방지해야 합니다. 대시를 포함하는 것이 IFS
그다지 어리석은 일이 아니기 때문에 결과가 부정적일 수 있는 경우 이는 훨씬 더 중요합니다 .
POSIX에서는 스크립트가 환경의 값에 영향을 받지 않도록 쉘이 IFS
시작될 때 기본값으로 설정되어야 한다고 규정합니다. IFS
(내보내기는 일반적이지 않지만 IFS
누군가는 할 수도 있습니다.) 그러나 널리 사용되는 일부 쉘(dash, Busybox sh)은 환경의 값을 보존하므로 강력한 쉘 스크립트에 인용되지 않은 확장이 포함된 경우 명시적으로 다음 과 같이 IFS
설정해야 합니다. IFS
기본값입니다(또는 설정을 해제해도 동일한 효과가 있습니다).