【问题标题】:Strange behaviour of bash script using tr [duplicate]使用 tr 的 bash 脚本的奇怪行为 [重复]
【发布时间】:2020-12-30 05:39:28
【问题描述】:

我有使用 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

【问题讨论】:

  • 你是说echo ABCD | tr [A-Z] [a-z]在非root用户执行时可以正常工作吗?
  • 您的工作目录中有一个名为a 的文件,不是吗?
  • 这两个命令在我的 Ubuntu 机器上都可以正常工作。
  • 请将ls -l [A-Z] [a-z] 的输出添加到您的问题中。
  • 顺便说一句,你不需要括号,tr A-Z a-z 就可以了。

标签: linux bash glob tr


【解决方案1】:

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。

【讨论】:

  • 我知道,但是为什么第一个 [A-Z] 即使没有引用也照样传递?在某些服务器上(也许他们有更现代的 bash)根本没有错误
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2019-03-19
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多