【讨论】tr [A-Z] [a-z] 不 work (都是 wildcard 惹的祸)

【讨论】tr [A-Z] [a-z] 不 work (都是 wildcard 惹的祸)

今下午帮一同事解决了一个 script 中的小问题, 在这里情景再现一下, 大家看看怎么回事
引用:
-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[4226 0] # echo Hello World | tr [A-Z] [a-z]
aello aorld
-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[4226 0] # o


      
老大那是什么啊
怎么错得还跟你的不一样
复制内容到剪贴板
代码:
[0 No.2018 huan@huan ~/tmp]$ echo Hello World | tr [A-Z] [a-z]
tr: 额外的操作数 ‘k’
请尝试执行‘tr --help’来获取更多信息。

[1 No.2019 huan@huan ~/tmp]$ echo Hello World | tr '[A-Z]' '[a-z]'
hello world

[0 No.2020 huan@huan ~/tmp]$ echo Hello World | tr 'A-Z' 'a-z'
hello world

[0 No.2021 huan@huan ~/tmp]$ echo $BASH_VERSION
3.1.17(1)-release

[0 No.2022 huan@huan ~/tmp]$
      
[QUOTE=li-jiahuan]老大那是什么啊
怎么错得还跟你的不一样
[/QUOTE]
这下更有意思了, 大家继续       
鬼啊。。。
2楼是在家里发的
现在这个是在公司里
同样的ubuntu edgy
同样的bash_version

[php]
[0 No.517 huanlf@huanlf-desktop ~]$ echo Hello World | tr [A-Z] [a-z]
hello world

[0 No.518 huanlf@huanlf-desktop ~]$ echo $BASH_VERSION
3.1.17(1)-release

[0 No.519 huanlf@huanlf-desktop ~]$
[/php]      
[QUOTE=li-jiahuan]鬼啊。。。
2楼是在家里发的
现在这个是在公司里
同样的ubuntu edgy
同样的bash_version
[/QUOTE]
这就是问题的神奇之所在       
谜底揭晓:
引用:
-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[14859 0] ; mkdir foo
-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[14859 0] ; cd ./foo
-(dearvoid@LinuxEden:tty3)-(~/tmp/foo)-
[14859 0] ; echo Hello World | tr [A-Z] [a-z]
hello world
-(dearvoid@LinuxEden:tty3)-(~/tmp/foo)-
[14859 0] ; touch a
-(dearvoid@LinuxEden:tty3)-(~/tmp/foo)-
[14859 0] ; echo Hello World | tr [A-Z] [a-z]
aello aorld
-(dearvoid@LinuxEden:tty3)-(~/tmp/foo)-
[14859 0] ; touch k
-(dearvoid@LinuxEden:tty3)-(~/tmp/foo)-
[14859 0] ; echo Hello World | tr [A-Z] [a-z]
tr: extra operand `k'
Try `tr --help' for more information.
-(dearvoid@LinuxEden:tty3)-(~/tmp/foo)-
[14859 1] ; o


      
还是避免让bash解释参数,加上引号      

记得abs里说过要引号


[php]
prayaya@Prayaya:~$ echo HeLLo WoRLd | perl -pe ' tr /[A-Z]/[a-z]/ '
hello world

prayaya@Prayaya:~$ echo HeLLo WoRLd | perl -pe ' y/[A-Z]/[a-z]/ '
hello world

prayaya@Prayaya:~$ echo HeLLo WoRLd | perl -pe ' s/([A-Z])/\L$1/g '
hello world

prayaya@Prayaya:~$
[/php]      
看到老大改标题了
想起一个很常用的应用
用于判断是否有符合一定模式的文件存在

[php]
prayaya@Prayaya:~/test$ rm * -rf
prayaya@Prayaya:~/test$ [ abc = ab* ] && echo Yes || echo No
No
prayaya@Prayaya:~/test$ touch abc
prayaya@Prayaya:~/test$ [ abc = ab* ] && echo Yes || echo No
Yes
[/php]

但实际上我自己不用这种不太好理解的方式
我更喜欢 ls ab* &>/dev/null  && echo Yes || echo No      
没有理解touch 的问题,解释一下?