Chinaunix首页 | 论坛 | 博客
  • 博客访问: 219702
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-09 10:55
个人简介

每天改变一点点,生活充满了惊喜。

文章分类

全部博文(42)

文章存档

2016年(8)

2015年(29)

2014年(5)

我的朋友

分类: LINUX

2015-10-21 12:59:36

1. echo "${var}" 和 echo ${var} 的区别
这两者的区别在于当变量值中包含转行符时,后者不会打印换行符。
而在一些场景下,打印换行符是很重要的,例如我要逐行处理字符串时:
echo "${var}" | while read line
如果错用成 echo ${var} ,所有内容就会按照一行读出来。

原因是,Shell命令在执行时会做变量替换,把变量名替换为变量值后继续执行,
上面的命令行中,echo ${var} 经过变量替换后,变量值中经,空格和换行符分隔的字符串,就变成了echo命令的多个参数。
而加上引号之后,整个内容会echo唯一的一个字符串参数。
(造成这种现象的另外一个原因是,Shell 命令行在解析的时候,将空格和换行符作为默认的分隔符)

其实在很多,Shell的编程场景下,这都是一个坑,稍不注意,最终得到效果与你预期的完全是不一样的,例如:
在做字符串比较的时候,函数传参的时候,等等。

2.  循环结构 管道 进程 
        
写循环结构时,我们经常使用管道来传递输入,会发现一个问题,在循环中对变量所做的操作都会无效。
         因为此时,Shell会启动子进程来执行循环结构,变量的变更发生在子进程的执行环境,在执行完之后就退出了。
         父进程是无法获取到子进程中的变量值的(除非采用进程通信的方式)。
        例如:
        echo "${content}" |
            while read line
            do
                do something ...
            done           
        要实现想要的效果,可以用下面的结构:
        while read line
       do
           do something ...
       done  <         $(echo "${content}")
EOF
阅读(1418) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~