一、避免不必要的外部命令避免管道嵌套太深
写shell角本很爽,其中管道与重定向提供的强大的组合能力功不可没,管道的结构始终闪现在UNIX的设计中,促进了“做单件事比做好”哲学的萌发,因此写shell角本时很容易习惯性地拼接管道,awk、sed、bc等外部命令嵌入太多,管道层次太深,导致性能不佳,awk、sed等外部命令具有强大的文本处理能力,带来的弊端是频繁的进程生成维护的性能开销,针对此可以:
- shell本身提供了丰富的字符串处理能力,如果能用原生的命令处理的不要使用awk、sed处理
(shell字符串操作可以参考此文:http://tldp.org/LDP/abs/html/string-manipulation.html)
- 如果文本需要非常复杂的处理,可以考虑用perl、python等来实现,比如perl就是专门为了取代awk而诞生的
二、使用后台执行
如查任务执行需要比较长的时间,可以考虑把任务分割成多个子任务并放后台处理,在bash里很方便通过在命令后面加符合“&”启动新的后台进程,wait命令可用来等待所有后台进程执行完成(等待某个特定进程用:wait pid),并行处理伪码:
for ARG in $*;do
command $ARG &
NPROC=$(($NPROC+1))
if [ "$NPROC" -ge 4 ];then
wait
NPROC=0
fi