shell的一些问题

来源:互联网 发布:巨人网络策划笔试题 编辑:程序博客网 时间:2024/04/30 09:14

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%左右

原创粉丝点击