我的脚本包含
#!/bin/bash
echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LANG LC_NUMERIC
echo after: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
printf "%f\n" .34
当我在RHEL 6(bash 4.1.2)中运行此脚本时,它按预期工作:
before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LANG= LC_NUMERIC=
0.340000
但是当它在RHEL 5(bash 3.2.25)中运行时,printf
似乎忽略了缺少 LANG
环境变量并报告错误消息,因为它希望找到逗号(,)而不是点(。)作为小数分隔符:
before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LANG= LC_NUMERIC=
./myscript.sh: line 7: printf: .34: invalid number
0,000000
当我在启动脚本之前摆脱LANG环境变量时它起作用:
$ unset LANG
$ sh myscript.sh
LANG= LC_NUMERIC=
LANG= LC_NUMERIC=
0.340000
我总是在脚本的开头使用unset LANG
来防止这种副作用;但是,在这种情况下,似乎没有工作。
这是一个错误吗?
由于
答案 0 :(得分:0)
我可以在bash 4.4上重现你的问题。您可能设置了LC_ALL
,LC_ALL
假设以覆盖LANG
。
设置LC_ALL
:
echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LANG LC_NUMERIC
LC_ALL=es_ES.UTF-8
echo after: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
printf "%f\n" .34
给出:
./gash.sh: line 8: printf: .34: invalid number
0,000000
这只是设置LANG
:
LANG=es_ES.UTF-8
echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LC_ALL LC_NUMERIC
echo after: LC_ALL=$LC_ALL LC_NUMERIC=$LC_NUMERIC
printf "%f\n" .34
给出:
before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LC_ALL= LC_NUMERIC=
./gash.sh: línea 8: printf: .34: número inválido
0,000000
但是这个取消了两者:
LANG=es_ES.UTF-8
echo before: LANG=$LANG LC_NUMERIC=$LC_NUMERIC
unset LANG LC_ALL LC_NUMERIC
echo after: LANG=$LANG LC_ALL=$LC_ALL LC_NUMERIC=$LC_NUMERIC
printf "%f\n" .34
给出:
before: LANG=es_ES.UTF-8 LC_NUMERIC=
after: LANG= LC_ALL= LC_NUMERIC=
0.340000
所以,取消设置LANG
和 LC_ALL
。