跪求Linux大神,shell字符集大小写字母顺序问题

orz_O 发布于 2013/12/03 14:46
阅读 600
收藏 0
#!/bin/bash
function fun1(){
        case $aa in
          [A-Z])
          echo "input [A-Z]"
          ;;
          [a-z])
          echo "input [a-z]"
          ;;
        esac
}
aa=d
export LANG=“en_US.UTF-8”
echo $LANG
fun1

export LANG=C
echo $LANG
fun1

为什么运行结果不相同呢。。utf-8中的英文字母大小写不也是A-Z比a-z小么?



加载中
0
水海云
水海云

en_US.UTF-8的语言环境下系统是忽略字符串的大小写的,所以你将aa变量改成大写字母会发现输出结果是一样的,而将函数fun1中的case下的两个比较上下顺序换一下,会发现当aa变量为小写字母时输出结果一样了。

0
orz_O
orz_O

引用来自“水海云”的答案

en_US.UTF-8的语言环境下系统是忽略字符串的大小写的,所以你将aa变量改成大写字母会发现输出结果是一样的,而将函数fun1中的case下的两个比较上下顺序换一下,会发现当aa变量为小写字母时输出结果一样了。

不是这样的吧?当aa为a和A的时候就会正常显示。。

好像在en_US.UTF-8下大小写字母顺序变成了aAbBcC……这样了。。我不明白为什么会变成这个顺序。。

0
seaquester
seaquester
不要使用 [a-z] 这种表示法, 因为在 zh_CN* locale 下, 这表示这样的范围:
a A b B ........ x X y Y z

使用 [A-Z] 则表示:
A b B C c ......... x X y Y z Z

若要避免该问题,一般可以把 locale 改成 en_US* 或者是 C, 如:
export LANG=C

或者是改 LC_COLLATE 指定字元字串排序時使用 en_US* 或是 C 这种 locale 即可, 如:
export LC_COLLATE=C

建议使用POSIX的方式:
[[:lower:]]
[[:upper:]]

0
orz_O
orz_O

引用来自“seaquester”的答案

不要使用 [a-z] 这种表示法, 因为在 zh_CN* locale 下, 这表示这样的范围:
a A b B ........ x X y Y z

使用 [A-Z] 则表示:
A b B C c ......... x X y Y z Z

若要避免该问题,一般可以把 locale 改成 en_US* 或者是 C, 如:
export LANG=C

或者是改 LC_COLLATE 指定字元字串排序時使用 en_US* 或是 C 这种 locale 即可, 如:
export LC_COLLATE=C

建议使用POSIX的方式:
[[:lower:]]
[[:upper:]]

谢谢你的热心回答,我想知道的是为什么会是那种排序,我把字符集改成en_US.UTF-8问题同样存在,这是为什么?是在什么设置的么?
0
水海云
水海云

引用来自“灯火阑珊,寂寞流年”的答案

引用来自“水海云”的答案

en_US.UTF-8的语言环境下系统是忽略字符串的大小写的,所以你将aa变量改成大写字母会发现输出结果是一样的,而将函数fun1中的case下的两个比较上下顺序换一下,会发现当aa变量为小写字母时输出结果一样了。

不是这样的吧?当aa为a和A的时候就会正常显示。。

好像在en_US.UTF-8下大小写字母顺序变成了aAbBcC……这样了。。我不明白为什么会变成这个顺序。。

将LANG设置成en_US.UTF-8类似的本地语言环境时,系统是按字典顺序来进行比较和排序的,而POSIX和C locale是按照ASCII码大小排序的。
返回顶部
顶部