为什么ABS说tr' a-z' ' A-Z'需要引用?

时间:2014-06-25 16:04:27

标签: bash tr

ABS指南中有一段代码片段。

#!/bin/bash
# uppercase.sh : Changes input to uppercase.

tr 'a-z' 'A-Z'
#  Letter ranges must be quoted
#+ to prevent filename generation from single-letter filenames.

exit 0

我不明白这个评论,我仍然感到困惑 为什么我要引用字母范围?
我在git bash中执行这些代码,一切正常 任何人都可以告诉我一个例子,如果我不引用字母范围,我会收到错误吗?

对不起我的英语不好并帮忙......

1 个答案:

答案 0 :(得分:4)

该片段的评论是错误的(因为ABS的大部分内容;它是一个非常差的参考,不应该使用)。

如果有方括号:

tr [A-Z] [a-z]

... 然后您对[AZ]匹配的文件AB等有疑虑。有关更明显的演示,请尝试这样:

mkdir -p ~/tmp
cd ~/tmp
touch A B C
echo tr [A-Z] [a-z]

......看看它发出了什么。


作为注释 - 如果设置了nullglob选项,即使磁盘上没有单字符文件名,也可能在此处遇到麻烦。为了证明:

rm -rf ~/tmp
mkdir -p ~/tmp
cd ~/tmp
shopt -s nullglob
echo tr [A-Z] [a-z]

...并且您会看到tr被调用而根本没有参数,因为[A-Z][a-z]都被解释为不匹配任何文件的glob表达式,nullglob告诉shell简单地替换这些glob表达式。


要明确 - 全局扩展与tr具体无关;无论运行什么程序,shell都会将不带引号的[A-Z]更改为与模式匹配的单字符文件名列表。