Chinaunix

标题: 复杂命令双引号改单引号求助 [打印本页]

作者: bikkuri    时间: 2014-08-24 15:25
标题: 复杂命令双引号改单引号求助
本帖最后由 bikkuri 于 2014-08-24 17:16 编辑

大家好!
我碰到了一件很奇怪的事情,想向大家请教。
我的服务器上有这样一些文件,存放路径如下:
  1. [root@cloudband-be deferred]# ls -l /var/spool/postfix/deferred/*/*
  2. -rwx------ 1 postfix postfix 3114 Aug 24  2014 /var/spool/postfix/deferred/0/0EFE15405FF
  3. -rwx------ 1 postfix postfix 1365 Aug 24  2014 /var/spool/postfix/deferred/5/545615405FB
  4. -rwx------ 1 postfix postfix 3114 Aug 24  2014 /var/spool/postfix/deferred/7/7427154060C
  5. -rwx------ 1 postfix postfix 3486 Aug 24  2014 /var/spool/postfix/deferred/9/9C2AF54060F
  6. -rwx------ 1 postfix postfix 3462 Aug 24  2014 /var/spool/postfix/deferred/B/B055A540608
  7. -rwx------ 1 postfix postfix 1737 Aug 24  2014 /var/spool/postfix/deferred/D/D04E354046A
  8. -rwx------ 1 postfix postfix 3486 Aug 24  2014 /var/spool/postfix/deferred/D/DABB85405FE
  9. -rwx------ 1 postfix postfix 3275 Aug 24  2014 /var/spool/postfix/deferred/D/DF04A54060D
  10. -rwx------ 1 postfix postfix 3115 Aug 24  2014 /var/spool/postfix/deferred/E/E9C79540610
复制代码
然后我用以下的for命令来找出所有文件名,也是可以正常得到结果的。
  1. [root@cloudband-be deferred]# for file in /var/spool/postfix/deferred/*/*; do echo $file;done
  2. /var/spool/postfix/deferred/0/0EFE15405FF
  3. /var/spool/postfix/deferred/5/545615405FB
  4. /var/spool/postfix/deferred/7/7427154060C
  5. /var/spool/postfix/deferred/9/9C2AF54060F
  6. /var/spool/postfix/deferred/B/B055A540608
  7. /var/spool/postfix/deferred/D/D04E354046A
  8. /var/spool/postfix/deferred/D/DABB85405FE
  9. /var/spool/postfix/deferred/D/DF04A54060D
  10. /var/spool/postfix/deferred/E/E9C79540610
复制代码
之后就很诡异了,我想把这个for命令做一个alias,却发现执行alias之后的命令,得到的结果却和之前完全不一样。
  1. [root@cloudband-be deferred]# alias listfile="for file in /var/spool/postfix/deferred/*/*; do echo $file;done"
  2. [root@cloudband-be deferred]# listfile
  3. /var/spool/postfix/deferred/E/E9C79540610
  4. /var/spool/postfix/deferred/E/E9C79540610
  5. /var/spool/postfix/deferred/E/E9C79540610
  6. /var/spool/postfix/deferred/E/E9C79540610
  7. /var/spool/postfix/deferred/E/E9C79540610
  8. /var/spool/postfix/deferred/E/E9C79540610
  9. /var/spool/postfix/deferred/E/E9C79540610
  10. /var/spool/postfix/deferred/E/E9C79540610
  11. /var/spool/postfix/deferred/E/E9C79540610
复制代码
请问这是怎么回事呢?
要如何做才能使alias的结果和原命令的结果一样呢?
谢谢。

作者: bikkuri    时间: 2014-08-24 16:51
看来是双引号的问题,改用单引号就可以得到正确结果了。
  1. [root@cloudband-be ~]# alias listfile='for file in /var/spool/postfix/deferred/*/*; do echo $file;done'
  2. [root@cloudband-be ~]# listfile
  3. /var/spool/postfix/deferred/0/0EFE15405FF
  4. /var/spool/postfix/deferred/5/545615405FB
  5. /var/spool/postfix/deferred/7/7427154060C
  6. /var/spool/postfix/deferred/9/9C2AF54060F
  7. /var/spool/postfix/deferred/B/B055A540608
  8. /var/spool/postfix/deferred/D/D04E354046A
  9. /var/spool/postfix/deferred/D/DABB85405FE
  10. /var/spool/postfix/deferred/D/DF04A54060D
  11. /var/spool/postfix/deferred/E/E9C79540610
复制代码

作者: bikkuri    时间: 2014-08-24 16:56
本帖最后由 bikkuri 于 2014-08-24 16:58 编辑

但是但是但是,如果我要把一个很长的很复杂的命令由双引号改成单引号,就会出错。
这个命令的出处来自我的另外一个帖子:
http://bbs.chinaunix.net/thread-4151516-1-1.html
大家可以帮我看看是哪里错了,应该怎么改吗?
  1. [root@cloudband-be ~]# alias getPass="for file in /var/spool/postfix/deferred/*/*; do strings $file|awk -v OFS=\"|\" 'match(\$0,/(Date:[^)]*\\))|(Username|Password): *[^ ]*/,a){r[substr(a[0],1,1)]=a[0]}END{print r[\"U\"],r[\"P\"],r[\"D\"]}';done"
  2. [root@cloudband-be ~]# getPass
  3. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  4. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  5. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  6. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  7. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  8. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  9. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  10. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  11. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  12. [root@cloudband-be ~]#
  13. [root@cloudband-be ~]# alias getPass='for file in /var/spool/postfix/deferred/*/*; do strings $file|awk -v OFS="|" \'match(\$0,/(Date:[^)]*\\))|(Username|Password): *[^ ]*/,a){r[substr(a[0],1,1)]=a[0]}END{print r["U"],r["P"],r["D"]}\';done'
  14. -bash: syntax error near unexpected token `('
  15. [root@cloudband-be ~]#
复制代码

作者: cy西瓜仔    时间: 2014-08-24 22:24
回复 1# bikkuri
试了单引号双引号试晕了, 楼主不如暂时把命令写成脚本放到shell环境变量里面去, 也一样灰常方便效率

   
作者: blackold    时间: 2014-08-25 00:08
本帖最后由 blackold 于 2014-08-25 00:10 编辑

可以这样做,不过太别扭。

对于 bash , 单引号中不能有单引号,即使是转义的单引号。
作者: bikkuri    时间: 2014-08-25 09:00
谢谢您的指点。
  1. alias getPass='for file in /var/spool/postfix/deferred/*/*; do strings $file|awk -v OFS="|" "match(\$0,/(Date:[^)]*\\))|(Username|Password): *[^ ]*/,a){r[substr(a[0],1,1)]=a[0]}END{print r[\"U\"],r[\"P\"],r[\"D\"]}";done'
复制代码
改成这样以后可以正常执行了。
非常感谢!

blackold 发表于 2014-08-25 00:08
可以这样做,不过太别扭。

对于 bash , 单引号中不能有单引号,即使是转义的单引号。

作者: chengchow    时间: 2014-08-25 09:08
把结果赋给一个值,你可以用反引号``或者$()




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2