原创 (转载)shell的一些问题

2010-11-20 11:22 2216 1 1 分类: MCU/ 嵌入式

1、bc中的scale


echo "scale=0;13 * 0.6 "|bc


echo "scale=0;13 * 0.6 / 1"|bc -l


Jared Liu: bc做乘法是不受scale变量影响的,想解决这个问题就是第二种trick吧


2、bc的小数运算和四舍五入


echo "scale=2;2/3"|bc


awk BEGIN'{printf "%.2f\n", 2/3}'


awk BEGIN'{printf "%.0f\n", 2/3}'


Jared Liu: bc计算出来的结果小于1的时候(>0),整数部分会为空,而awk在制定float的条件下会自动四舍五入;另外如想想用bc,那么要自己写两行awk来模拟四舍五入的行为了,稍猥琐。。。。


3、正反通吃


cat的姐妹tac,写法是横向反向的,功能也是;还有一个孪生兄弟rev,纵向也反向了


Jared Liu: cat够用了


4、sed的bug?


sed -n '1,0p' filename


sed -n '1,1p' filename


Jared Liu: 结果都是返回一行


5、expr不能算乘法?


expr 5 * 5


expr: syntax error


Ray: 在shell中*是通配符,具有特殊意义,对于*的使用要进行转义,否则在解释的时候将*进行通配替换


解决:


expr 5 \* 5


echo $((5*5))


echo "5*5"|bc


6、rm -f的返回值


rm -f a.txt && echo OK,即使a.txt不存在也会echo OK


7、可以不使用管道时,减少管道的使用


cat someweb|grep "href"和grep "href" someweb


后者效率会好50%左右


8、尽量使用重定向,不用cat


如果对所有的脚本进行一下统计,那么使用的最多的几个命令当中,肯定有cat。


如果你关心脚本的效率,那就尽早放弃cat。(下面的数据可能会更有说服力)


而实际上,cat能完成的功能,基本都可以用重定向来完成。


例如:


cat file|while read x


do


       ((line++))


done


推荐采用重定向完成:


(这同时也解决了父shell进程和子shell进程数据共享的问题)


while read x


do


       ((line++))


done < file


第二种写法能提高效率90%左右


9、尽量使用内置命令,而不用同样功能的系统命令


对于内置命令,(可以通过man builtin查看),在执行的时候是不会产生子shell进程的。因此其执行速度会远远的高于系统命令。


例如:echo是一个bash内置的命令。当然,也存在和其功能相同的一个系统命令,名字也叫echo,在/bin/echo。这两个的性能差距是很大的。后者效率比前者低90%左右。


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /3 下一条