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

Bash 为什么ABS会说tr';a-z'';A-Z';需要引用吗?,bash,tr,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中执行这些代码,一切正常。 有人

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中执行这些代码,一切正常。
有人能给我举个例子,如果我不引用字母范围,我会出错吗?


对不起,我的英语很差,请帮忙……

这个片段的注释是错误的(正如大部分ABS一样;它是一个非常糟糕的参考,不应该使用)

如果有方括号:

tr [A-Z] [a-z]
…然后您会担心[a-Z]匹配名为
a
B
等的文件。要获得更直观的演示,请尝试以下方法:

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表达式替换为零即可



需要明确的是——glob扩展与
tr
无关;shell会将不带引号的
[A-Z]
更改为与模式匹配的单字符文件名列表,而不管运行的是什么程序。

代码段的注释是错误的(与大多数ABS一样;这是一个非常糟糕的参考,不应该使用)

如果有方括号:

tr [A-Z] [a-z]
…然后您会担心[a-Z]匹配名为
a
B
等的文件。要获得更直观的演示,请尝试以下方法:

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表达式替换为零即可



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

(以及相关的FAQ和wiki)是比ABS更积极维护的资源——freenode的#bash频道的用户努力使指南保持最新和准确,然而,ABS中的错误很少得到修复。(以及相关的FAQ和wiki)是比ABS更积极维护的资源——freenode的#bash频道的居民努力使指南保持最新和准确,而ABS中的错误很少得到纠正。谢谢你的回答。[A-Z]与文件A、B、C匹配。[A-Z]与文件A、B、C匹配。“echo tr[A-Z][A-Z]”的输出是“tr A B C A B C”,这很清楚。但我对你的第二段代码感到困惑。我执行'shopt-s nullglob'并且[a-z]/[a-z]与以前一样工作。我们假设[a-z]/[a-z]与任何文件都匹配。然后,我猜‘echo tr[A-Z][A-Z]”的输出是‘tr[A-Z][A-Z]”或只是‘tr’。你是不是想说:“echo | tr[A-Z][A-Z]”?注:我的bash版本是“GNU bash,版本4.3.11(1)-发行版(x86_64-pc-linux-GNU)”。@android_-su,每个模式匹配的文件取决于您所在区域的排序顺序——在任何地方都不一样。有些区域设置的顺序是
AaBbCc…
,有些区域设置的顺序是
ABC…ABC…
…不,我不是说
echo | tr
。目标是显示如果没有echo,tr将如何运行,因此
echo tr
是正确的。感谢您的患者。我认为,
echo\u something\u
的输出就是
\u something\u
。所以你所有的例子都与
tr
无关?您说过“您将看到tr被调用时根本没有参数”。所以我想也许你试着说
echo | tr…
。我是一个新的巴什。抱歉这些简单的问题。我的意思是,只调用了
echo
,而不是
tr
tr
在这里只是一个字符串。对吧?谢谢你的回答。[A-Z]与文件A、B、C匹配。[A-Z]与文件A、B、C匹配。“echo tr[A-Z][A-Z]”的输出是“tr A B C A B C”,这很清楚。但我对你的第二段代码感到困惑。我执行'shopt-s nullglob'并且[a-z]/[a-z]与以前一样工作。我们假设[a-z]/[a-z]与任何文件都匹配。然后,我猜‘echo tr[A-Z][A-Z]”的输出是‘tr[A-Z][A-Z]”或只是‘tr’。你是不是想说:“echo | tr[A-Z][A-Z]”?注:我的bash版本是“GNU bash,版本4.3.11(1)-发行版(x86_64-pc-linux-GNU)”。@android_-su,每个模式匹配的文件取决于您所在区域的排序顺序——在任何地方都不一样。有些区域设置的顺序是
AaBbCc…
,有些区域设置的顺序是
ABC…ABC…
…不,我不是说
echo | tr
。目标是显示如果没有echo,tr将如何运行,因此
echo tr
是正确的。感谢您的患者。我认为,
echo\u something\u
的输出就是
\u something\u
。所以你所有的例子都与
tr
无关?您说过“您将看到tr被调用时根本没有参数”。所以我想也许你试着说
echo | tr…
。我是一个新的巴什。抱歉这些简单的问题。我的意思是,只调用了
echo
,而不是
tr
tr
在这里只是一个字符串。正确的?