免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cao627
打印 上一主题 下一主题

[文本处理] sed 替换中变量展开的疑问 [复制链接]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
21 [报告]
发表于 2013-01-26 16:41 |只看该作者
本帖最后由 blackold 于 2013-01-26 16:44 编辑

回复 19# cao627


        觉得你的表述方法有问题:

如果:b="b b"
我们会说:echo aaa"${b}"bbb是表像   经变量展开,shell实际的执行语句是:echo aaab baaa


那么我们在终端直接输入命令
  1. $ echo aaab baaa
复制代码
时,实际执行的是什么?

另外,你也可以通过 set -vx 来察看命令的执行过程。不过也许你觉得那也是“表象“。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
22 [报告]
发表于 2013-01-26 18:05 |只看该作者
回复 21# blackold


那么我们在终端直接输入命令

    $ echo aaab baaa

复制代码
时,实际执行的是什么?


恩。我在文中已经否定了这种表述。

echo aaa"${b}"aaa的本质不是echo aaab baaa

echo aaab baaa只是echo aaa"${b}"aaa进一步表象,
就像入带着有色眼镜看到的是表象,摘掉有色眼镜(进一步直接)看到的依然是表象,只是不能再进一步直接了。









论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
23 [报告]
发表于 2013-01-26 18:18 |只看该作者
回复 22# cao627


   既然你不能确定它是什么,那讨论还有什么意义呢?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
24 [报告]
发表于 2013-01-26 18:53 |只看该作者
本帖最后由 cao627 于 2013-01-26 18:56 编辑

回复 23# blackold

当b=b时
对shell来说
echo aaa${b}aaa 相同效果表象是 echo aaabaaa 对吗
还有比echo aaabaaa 更简单或同等简单但形状不同的相同效果表象吗?没有。可以说 echo aaabaaa 是 echo aaa${b}aaa的彻底直接

当b="b
b"时
对shell来说
echo aaa${b}aaa 的等价表象是
echo "aaab
baaa"
还有同等简单的等价体
echo aaa"b
baaa" 等等。所以不是彻底直接

所以
echo aaabaaa对echo aaa${b}aaa来说是彻底摘掉了有色眼镜。

echo "aaab
baaa"只是许多不同颜色的有色眼镜中的一副,还有其他多副如
echo aaa"b
baaa" 等等。





















   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
25 [报告]
发表于 2013-01-26 19:16 |只看该作者
回复 24# cao627

当b="b
b"时
对shell来说
echo aaa${b}aaa 的等价表象是
echo "aaab
baaa"
还有同等简单的等价体
echo aaa"b
baaa"


这本身就错了——echo aaa${b}aaa 和 echo "aaab
baaa"的输出结果都不同,二者还等价?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
26 [报告]
发表于 2013-01-27 11:02 |只看该作者
回复 25# blackold


写错了 是echo aaa"${b}"aaa

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
27 [报告]
发表于 2013-01-27 11:22 |只看该作者
先把shell命令处理流程弄清楚就明白了。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
28 [报告]
发表于 2013-01-27 13:03 |只看该作者
回复 27# blackold



我只是在就一个东西,说和这个东西无关的话。

再做个总结:


b="b"
echo aaa"${b}"aaa 的彻底直接是 echo aaabaaa。
所谓的的彻底直接是再没有更简化的形式或相同简单的其他形式。

当b="b
b"
echo aaa"${b}"aaa 没有彻底直接
echo "aaab
baaa" 是其非彻底直接。因为还后相同复杂度(两者都有6个a2个b2个"一个回车组成)的
echo aaa"b
baaa"等等。
能否对这些非彻底直接做进一步简化,比6个a2个b2个"一个回车再简短一点,使它输入shell执行得到与echo aaa"${b}"aaa一样的输出?不能。

也许很无聊,也没什么意义!




论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
29 [报告]
发表于 2013-01-27 13:43 |只看该作者
回复 28# cao627


    你的说法本身就错了。

两者都有6个a2个b2个"一个回车组成)


最后的双引号(或单引号)只是为了表示上的方便,实际上是没有双引号(或单引号)的。

当b="b
b"
echo aaa"${b}"aaa

经shell进行参数展开后成为 echo aaa"b
b"aaa
(你可以说展开后成为 aa"ab
baa"a,因为实际上是没有双引号的)
echo实际看到是 aaab后接一个换行符,再后接baaa,所有这些作为一个字(word)。echo 直接把这个字输出到终端,我们看到的结果就是:
aaab
baaa

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
30 [报告]
发表于 2013-01-27 14:16 |只看该作者
回复 29# blackold

经shell进行参数展开后成为 echo aaa"b
b"aaa
(你可以说展开后成为 aa"ab
baa"a,因为实际上是没有双引号的)


你误解我了
在shell层面是没有双引号的。

我说的是表象层面

请问:你如何在命令提示符后输入echo命令(输入表象),使他输出两行输出(输出表象)。






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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP