사용자 정의 IFS는 printf 형식을 변경합니다.

사용자 정의 IFS는 printf 형식을 변경합니다.

천 단위 구분 기호를 사용하여 숫자 형식을 지정해야 하는 스크립트가 있습니다. 그래서 1234567그것은 1,234,567. 나는 그것을 사용하여 printf "%'d" 1234567결과를 얻습니다. 잘 작동합니다. 스크립트 후반부에서 IFS=","문자열 쌍 테이블을 처리하기 위한 사용자 정의를 설정했습니다. 그런 다음 이 기능을 사용하면 printf "%'d"쉼표가 아닌 공백이 표시됩니다. IFS기본값으로 재설정하면 printf예상대로 동작합니다. IFSprintf 형식에 영향을 미치는 이유는 무엇입니까 ?

답변1

따라서 아마도 그런 일이 일어나고 있거나 이와 유사한 일이 있을 것입니다(예를 들어 POSIX가 아닌 로케일을 사용하는 경우 en_US.UTF-8). 중요한 점은 다음을 사용할 때 인용이 누락된다는 것입니다 $var.

$ printf "%'d\n" 1234567
1,234,567
$ var=$(printf "%'d\n" 1234567)
$ echo $var
1,234,567
$ IFS=,
$ echo $var
1 234 567

변수가 $var따옴표 없이 사용되기 때문에 쉘은 변수 값을 의 문자로 분할하여 $IFS각 인수에 대해 별도의 인수를 생성합니다(쉘은 생성된 각 단어에 대해 파일 이름 글로빙도 수행하지만 여기서는 수행되지 않습니다. 이 예에서는 문제가 있습니다). 유틸리티 echo는 인수 사이에 공백이 있고 끝에 개행 문자가 있는 인수를 인쇄합니다.

인용된 변수의 확장 및 명령 대체가 필요합니다. 아래에서는 다음 명령을 사용하여 "변수로 인쇄"하는 방법도 보여줍니다 printf.

$ printf -v var "%'d" 1234567
$ printf '%s\n' "$var"
1,234,567
$ IFS=,
$ printf '%s\n' "$var"
1,234,567

관련된:

관련 정보