LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1673|回复: 4

shell命令行解析以及sed替换命令的怪异问题,高手指点

[复制链接]
发表于 2008-5-23 18:09:27 | 显示全部楼层 |阅读模式
如下
命令 echo 'aaa////aaa' | sed 's/\\//\\\\\\//g',有错误

如果将命令改为:
xx=`echo 'aaa////aaa' | sed 's/\\//\\\\\\//g'`;echo $xx   
则正确 ,输出为 aaa\/\/\/\/aaa

再将上述命令的后引号``,改为$(),又出现错误

如果将sed替换命令的定界符改为!,如下命令也可实现同样的效果,
xx=`echo 'aaa////aaa' | sed 's!/!\\\\/!g'`;echo $xx
且后引号``改为$()也可以运行,后引号中的命令也可单独运行。

请高手帮忙分析下 上述错误命令的错误原因
发表于 2008-5-25 00:38:02 | 显示全部楼层
首先声明我不是高手,看到你只发了几个帖子,为了不至于对这个论坛太失望,说一点我的看法。

你没有明确说明是用的哪种shell,这里就姑且认为是bash吧。
对于echo 'aaa////aaa' | sed 's/\\//\\\\\\//g' 有错误,是因为bash对单引号中的每个字符都保持原来得意思,不会对\特别处理,所以再单引号中是不能包括单引号的,比如'\''这样就是错误的,这里\并没有特殊的意思。关于单引号的用法,在bash的手册中是这样说的:
Enclosing characters in single quotes (‘'’) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

所以sed接收到的参数就是s/\\//\\\\\\//g,所以最后的那个/就是多余的了,所以是错误的。

对于x=`echo 'aaa////aaa' | sed 's/\\//\\\\\\//g'`;echo $xx
反引号是命令替换的意思,在bash手册中是如下介绍的:
When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by ‘$’, ‘`’, or ‘\’. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.

所以在执行命令前被替换成了,echo 'aaa////aaa' | sed 's/\//\\\//g'
sed得到的参数就是s/\//\\\//g,所以就是正确的。

对于$(),上面的英文解释里也包括了,在执行命令替换前不会把\\替换为\,所以把第二个的`改为$()发生了错误。

对于sed,在命令中包括/时,最好是改变定界符。

提醒一下,最后两个命令的结果是不同的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-26 10:54:10 | 显示全部楼层
谢谢你的回答,基本上明白了。
就是说,在反引号包含的命令被执行前,又被解析了一边,就算是单引号中的内容也不放过。
所以bash中增添了反引号的替代品$():摒弃这种命令执行前的解析,达到“所见即所得”的效果。
回复 支持 反对

使用道具 举报

发表于 2008-5-26 12:29:58 | 显示全部楼层
Post by tutorialljk;1855141

就是说,在反引号包含的命令被执行前,又被解析了一边,就算是单引号中的内容也不放过。
所以bash中增添了反引号的替代品$():摒弃这种命令执行前的解析,达到“所见即所得”的效果。

我的理解应该是这样的,你可以多做几个实验试试。
回复 支持 反对

使用道具 举报

发表于 2008-6-2 08:07:40 | 显示全部楼层
我也收下了。原来还有这个区别。我也遇到过与楼主的内类同的问题。
不懂英文就是吃亏。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表