使用 tr 的 bash 脚本的奇怪行为

问题描述

我有使用 tr 命令的遗留脚本,并且在某些服务器上(我不知道有什么区别)这样的命令

echo ABCD | tr [A-Z] [a-z]

工作不正确 - 第二个参数的传递就像 a 而不是 [a-z] 如果我引用所有参数 - 它工作正常:

echo ABCD | tr '[A-Z]' '[a-z]'

此外,如果仅由 root 执行命令,则会看到不正确的行为,其他用户不会出现此错误

请告诉我这种行为的原因是什么。

UPD

ls -l [A-Z] [a-z]
ls: cannot access [A-Z]: No such file or directory
-rw-r--r--. 1 root root 4870 Mar  2  2018 a

解决方法

tr 是 linux 上的翻译命令。并且这两个参数应该是表示“有点正则表达式”选择的字符串。

根据man tr

tr [选项]... SET1 [SET2]

SET 被指定为字符串

所以

echo ABCD | tr '[A-Z]' '[a-z]'

正在用相应的小写字母替换所有大写字母。

echo ABCD | tr [A-Z] [a-z]

不起作用,因为正则表达式显示为 linux 命令,而您的 shell 会尝试运行它们。

编辑: 这两个命令都适用于 bash。但只有引用的一项适用于 zsh。因此,root 和其他用户可能使用不同的 shell 解释器。请您使用 echo $SHELL 检查用户正在使用哪个 shell。