Chinaunix
标题:
复杂命令双引号改单引号求助
[打印本页]
作者:
bikkuri
时间:
2014-08-24 15:25
标题:
复杂命令双引号改单引号求助
本帖最后由 bikkuri 于 2014-08-24 17:16 编辑
大家好!
我碰到了一件很奇怪的事情,想向大家请教。
我的服务器上有这样一些文件,存放路径如下:
[root@cloudband-be deferred]# ls -l /var/spool/postfix/deferred/*/*
-rwx------ 1 postfix postfix 3114 Aug 24 2014 /var/spool/postfix/deferred/0/0EFE15405FF
-rwx------ 1 postfix postfix 1365 Aug 24 2014 /var/spool/postfix/deferred/5/545615405FB
-rwx------ 1 postfix postfix 3114 Aug 24 2014 /var/spool/postfix/deferred/7/7427154060C
-rwx------ 1 postfix postfix 3486 Aug 24 2014 /var/spool/postfix/deferred/9/9C2AF54060F
-rwx------ 1 postfix postfix 3462 Aug 24 2014 /var/spool/postfix/deferred/B/B055A540608
-rwx------ 1 postfix postfix 1737 Aug 24 2014 /var/spool/postfix/deferred/D/D04E354046A
-rwx------ 1 postfix postfix 3486 Aug 24 2014 /var/spool/postfix/deferred/D/DABB85405FE
-rwx------ 1 postfix postfix 3275 Aug 24 2014 /var/spool/postfix/deferred/D/DF04A54060D
-rwx------ 1 postfix postfix 3115 Aug 24 2014 /var/spool/postfix/deferred/E/E9C79540610
复制代码
然后我用以下的for命令来找出所有文件名,也是可以正常得到结果的。
[root@cloudband-be deferred]# for file in /var/spool/postfix/deferred/*/*; do echo $file;done
/var/spool/postfix/deferred/0/0EFE15405FF
/var/spool/postfix/deferred/5/545615405FB
/var/spool/postfix/deferred/7/7427154060C
/var/spool/postfix/deferred/9/9C2AF54060F
/var/spool/postfix/deferred/B/B055A540608
/var/spool/postfix/deferred/D/D04E354046A
/var/spool/postfix/deferred/D/DABB85405FE
/var/spool/postfix/deferred/D/DF04A54060D
/var/spool/postfix/deferred/E/E9C79540610
复制代码
之后就很诡异了,我想把这个for命令做一个alias,却发现执行alias之后的命令,得到的结果却和之前完全不一样。
[root@cloudband-be deferred]# alias listfile="for file in /var/spool/postfix/deferred/*/*; do echo $file;done"
[root@cloudband-be deferred]# listfile
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
/var/spool/postfix/deferred/E/E9C79540610
复制代码
请问这是怎么回事呢?
要如何做才能使alias的结果和原命令的结果一样呢?
谢谢。
作者:
bikkuri
时间:
2014-08-24 16:51
看来是双引号的问题,改用单引号就可以得到正确结果了。
[root@cloudband-be ~]# alias listfile='for file in /var/spool/postfix/deferred/*/*; do echo $file;done'
[root@cloudband-be ~]# listfile
/var/spool/postfix/deferred/0/0EFE15405FF
/var/spool/postfix/deferred/5/545615405FB
/var/spool/postfix/deferred/7/7427154060C
/var/spool/postfix/deferred/9/9C2AF54060F
/var/spool/postfix/deferred/B/B055A540608
/var/spool/postfix/deferred/D/D04E354046A
/var/spool/postfix/deferred/D/DABB85405FE
/var/spool/postfix/deferred/D/DF04A54060D
/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
大家可以帮我看看是哪里错了,应该怎么改吗?
[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"
[root@cloudband-be ~]# getPass
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
Username: kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
[root@cloudband-be ~]#
[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'
-bash: syntax error near unexpected token `('
[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
谢谢您的指点。
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