Korn Shell识别大写单词脚本异常:小写单词被误判为大写求助
脚本问题分析与解决方法
你的ksh脚本出现错误判定的原因是字符范围匹配受系统locale设置影响。
在默认的UTF-8 locale(如en_US.UTF-8)中,[A-Z]的匹配逻辑并非严格遵循ASCII字符顺序。这类locale的字符排序规则为aAbBcC...zZ,导致[A-Z]会匹配A到Z之间的所有字符——其中包含小写字母a到y,所以输入po时会被错误识别为符合大写规则。
两种可行的修复方案:
方案1:强制使用ASCII字符集匹配规则
在脚本开头设置LC_COLLATE=C,让字符范围匹配严格按照ASCII顺序执行:
#!/usr/bin/ksh export LC_COLLATE=C var=$1 if [[ ${var} == +([A-Z]) ]] then echo "$var is UPPERCASE word" else echo "$var is not UPPERCASE word" fi
方案2:使用POSIX标准大写字符类
用[:upper:]替代[A-Z],该字符类不受locale影响,是更可靠的大写字符匹配方式:
#!/usr/bin/ksh var=$1 if [[ ${var} == +([[:upper:]]) ]] then echo "$var is UPPERCASE word" else echo "$var is not UPPERCASE word" fi
修改后执行./test.ksh po,会正确返回po is not UPPERCASE word。
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

