问题描述
我有使用 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。