
bc
나는 수학을 사용하고 수행하는 스크립트를 만들었습니다 printf
.
cygwin
locale is 에서는 잘 작동 하지만 en_US.UTF-8
Linux(로케일)에서 실행하면 소수 구분 기호 en_ES.UTF-8
로 사용되기 때문에 실패합니다 . ,
예를 들어 다음 표현식은 실패합니다.
avg=$(printf %.2f $(echo "scale=4; $val1/$val2" | bc -l ))
해결책을 찾았습니다. 스크립트 앞에 추가하십시오 LC_ALL=C.UTF8
.
LC_ALL=C.UTF8 ./script.sh [OPTIONS]
하지만, 내 생각에는 이런 일은 하지 않는 것이 가장 좋은 것 같다.
그래서 내 질문은: 사용자 프로필에 설정된 로케일에 관계없이 이와 같은 문제를 피하기 위해 스크립트 내부의 로케일만 변경할 수 있는 방법이 있습니까?
답변1
스크립트 내에서 export LC_ALL=C.UTF-8
시작 부분에 1을 추가하기만 하면 됩니다(셔뱅 라인이 있는 경우 바로 다음).
그러면 스크립트에 의해 실행되는 모든 명령이 LC_ALL
.
로케일 변경에 영향을 받지 않는 스크립트의 일부가 필요하지만 로케일을 존중하기 위한 스크립트의 일부가 필요한 경우(예를 들어 일부 값을 계산하고 인쇄하려는 경우) unset LC_ALL
계산 후 이를 수행하고 싶을 수 있습니다. 인쇄하기 전에. 또는 명령별 설정으로 스크립트의 특정 명령에만 접두어를 붙이도록 선택할 수 있습니다.
일부 플랫폼에서는 C 로케일의 UTF-8 버전을 다르게 철자합니다(대소문자가 다르거나 하이픈이 누락됨
UTF-8
). 보다 플랫폼 독립적인 버전은 다음과 같습니다.export LC_ALL=$(locale -a|grep -ix 'c.utf-\?8' || echo C)