bash 正在改变我的 tr 语句

bash 正在改变我的 tr 语句

使用跟踪选项 -v 和 -x 以下代码运行 bash (4.1.2) 脚本

for Option in "$@"; do
OptName=$(echo $Option | tr [:lower:] [:upper:])

结果是

+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr '[:lower:]' '[:upper:]'
+ OptName=-DEBUG

这正是我所期望的。但是,另一个用户从同一主机运行相同的 bash 版本会导致

+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr r r
+ OptName=-debug

请注意,翻译命令已更改为“tr r r”。到目前为止,只有这一个用户,所以它必须是环境中的某种东西(对吗?)。

对于可能导致此问题的原因有什么建议吗?

答案1

r您有一个名为so 的文件[:upper:]扩展为r.

尝试

tr '[:lower:]' '[:upper:]' 

(编辑)我的测试

%_ ls
%_ echo [:upper:]
[:upper:]
%_ touch r
%_ echo [:upper:]
r
%_

bash 分几个阶段解析您的命令行,其中之一是“通配”,又称文件名扩展。因此,当 bash 看到 时tr [:lower:] [:upper:],它会找到 tr 二进制文件,然后看到括号[ ... ]并说“啊,所以您想匹配使用以下字符之一命名的文件::lower。我明白了一个名为r-- 给你!

如果没有 r 文件,bash 不能也不会扩展[...]通配符。

相关内容