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) |