Chinaunix

标题: \把我搞晕了,请指点 [打印本页]

作者: loveface    时间: 2008-04-02 22:50
标题: \把我搞晕了,请指点
正在学习abs,其中“\"让我很难理解:

echo \z          # z      
echo \\z         #\z
echo '\z'        #\z
echo '\\z'        #\\z

后三个容易理解,第一个为什会成为space?

1    echo `echo \z`           # z         
2    echo `echo \\z`          # z         
3    echo `echo \\\z`         #\z
4    echo `echo \\\\z`        #\z
5    echo `echo \\\\\\z'       #\z
6    echo `echo \\\\\\\z'      #\\z

第二行和上面的 echo \\z不一样吗?
为什么3、4、5行结果一样,而到第6行多了一个\就不一样了?\的作用和它的奇偶数没有对应关系吗?

感觉很乱啊,找不到规律,比如奇数偶数个\对结果的影响。

请指教啊!

[ 本帖最后由 loveface 于 2008-4-8 14:42 编辑 ]
作者: loveface    时间: 2008-04-04 07:52
标题: 回复 #1 loveface 的帖子
是不是太简单了,这问题。
作者: 灿烂小猪    时间: 2008-04-04 20:29
http://bbs.chinaunix.net/viewthr ... A1%D6%ED&page=1
看看这个,我也一直没有搞清楚这个问题!关注中。。。
作者: shisanlangd    时间: 2008-04-07 01:38
这是我的看法,不一定正确:
echo `echo \z`,简称第一个echo为echoA,第二个echo为echoB
在``中的echoB命令中的字母前有\,不对其后的字母有转义作用,
echo `echo \\\z`  = echo \\z
echo `echo \\\\z` = echo \\z
echoA中 \ 还是起作用的,所以上面的结果都为
\z
作者: happyc84    时间: 2008-04-07 08:59
刚开始看 the c programme language
其中有道 练习题
要求
打印几个\t \n \b 之类的字符 然后再打印 几个没有特殊功能的字符  比如 \z
做到这个题的时候  我一编译  提示 未知的跳脱字符  我以为错了,就跳过去了
今天看到lz的问题 我又做了一遍 还是那样的提示 不过是个警告 可执行文件还是可以生成的。
printf("%c",'\z')    运行结果 就是一个z (我的理解是 \? 如果跳脱有效 则为跳脱字符 如果无效则为 ? 本身)

第一个理解了 后边的就好说了吧!
晕 没看清楚 第一个是 space z 吗?
我这里是这样的。
echo \z |wc -c
1

[ 本帖最后由 happyc84 于 2008-4-7 09:08 编辑 ]
作者: blackold    时间: 2008-04-07 09:09
标题: 回复 #1 loveface 的帖子
set -x
command 就清楚是怎么回事了。

  1. $ set -x

  2. $ echo `echo \\\z`
  3. ++ echo '\z'
  4. + echo '\z'
  5. \z
复制代码

作者: loveoov    时间: 2008-04-07 15:41
标题: 回复 #6 blackold 的帖子
还是不明白
[root@localhost shell]# echo `echo \\\\\\\q`
echo `echo \\\\\\\q`
echo \\\\q
++ echo '\\q'
+ echo '\\q'
\\q
[root@localhost shell]# echo \\\\\\\q
echo \\\\\\\q
+ echo '\\\q'
\\\q
为什么第一个`echo \\\\\\\q`出来的是\\\\q 而第二个出来的是\\\q
作者: blackold    时间: 2008-04-07 20:52
原帖由 loveoov 于 2008-4-7 15:41 发表
还是不明白
[root@localhost shell]# echo `echo \\\\\\\q`
echo `echo \\\\\\\q`
echo \\\\q
++ echo '\\q'
+ echo '\\q'
\\q
[root@localhost shell]# echo \\\\\\\q
echo \\\\\\\q
+ echo '\\\q'
...


在第一个命令中,命令替换``(反引号)中的\\\\\\\q解释为\\\\q。
而在第二个命令中,\\\\\\\q解释为\\\q。

有与没有``(反引号)是不同的。

请参考以下相关主题:
关于引用符号 \ 的疑问
echo命令的转义的\b的疑惑
请教echo -e x\ty为啥不显示中间的制表符?
echo问题

[ 本帖最后由 blackold 于 2008-4-7 21:02 编辑 ]
作者: 灿烂小猪    时间: 2008-04-08 03:53
搜了一堆贴,感觉问题还是出在``命令替换上!!!

echo `echo \\\\\\\q`
echo \\\\q
++ echo '\\q'
+ echo '\\q'
\\q
在命令替换中,与在""双引号中一样。\只会转义$ ` " \  <newline>(注:<newline>是\加回车,另起一行),除此之外,其它的不会转义!
\\\\\\\q中前面的3对\会转义,而最后一个\q不会转义,所以echo `echo \\\\\\\q`这当中的`echo \\\\\\\q`的结果为\\\\q
而echo \\\\q经过转义后,其结果为\\q


echo `echo \\\\\\q`
echo \\\q
++ echo '\q'
+ echo '\q'
\q
\\\\\\q这当中的前6个杠,这一行理所当然的转为\\\q
echo \\\g由于没有在命令替换中,所以最后的\q被转义,即输出为\q

个人拙见,如有不对的地方欢迎大家批评指正。同时感谢大家的热心帮助

[ 本帖最后由 灿烂小猪 于 2008-4-8 03:58 编辑 ]
作者: loveface    时间: 2008-04-08 14:44
标题: 回复 #5 happyc84 的帖子
是的,“# z” 中间是有空格的。
作者: 灿烂小猪    时间: 2008-04-08 14:54
标题: 回复 #10 loveface 的帖子
在我的环境下没有!
作者: blackold    时间: 2008-04-08 15:47
原帖由 loveface 于 2008-4-8 14:44 发表
是的,“# z” 中间是有空格的。


你执行的环境是什么?echo是哪一版本呢?
作者: woodie    时间: 2008-04-08 16:52
标题: 回复 #1 loveface 的帖子
我以前碰巧研究过这个,请参考这里:
shell历险之——引用的迷途
作者: blackold    时间: 2008-04-08 16:55
对于不同的环境,不同的echo版本,上述命令的结果可能会不同。

另外,``是老式命令替换,难读难嵌套,不推荐使用。




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