总结的一些shell小技巧,时时更新中。。
(1)使用&&和||的短路特性,假如传递了参数,PARAM=参数,否则给PARAM赋一个值。(简化if else)
[[ -n "$1" ]] && PARAM=$1 || PARAM=value
(2)测试上一个命令的退出状态,将错误写入log文件。
[ $? –gt 0 ] && echo 'Something Wrong, please investigate!' >> ${LOG_FILE}
(3)脚本中产生的一些文件,比如log之类记得最后赋以合适的权限和群组。
find -type f -mtime -1 –user `whoami` -exec chmod 777 {} \;
find -type f -mtime -1 –user `whoami` -exec chgrp group {} \;
(4)删除掉脚本中的无用空行。
sed -i "^$ d" file
(5)测试脚本
sh -n script #检测语法,不会run脚本
sh -x script #shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。
#"+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。
#在跑脚本之前执行sh –n 是很好的习惯,-x可以帮助我们关注到运算结果,逻辑判断结果,变量赋值等等。
(6)将一部分必要的环境配置写入文件,并且在脚本开始调用该文件。例如配置sas环境:
SAS_HOME=sas_path/sas
SAS_TEST=”${SAS_HOME} -nonews -stdio -nosyntaxcheck"
同时使用恰当的alias能简洁脚本,例如:
alias grep="grep –rE --color"
alias c='clear'
alias x='exit'
alias ll='ls -l'
alias ldir='ls -l | grep "^d"'
(7)判断脚本中一个数组为空的时候,不能使用if [-z ${ array[@]}]
。因为-z
智能判断一个变量是否为空。应该使用if [ S{array[@]} -eq 0]
,通过数组元素的个数来判断。
(8)使用rm
命令千万千万慎重!尽可能的使用绝对路径,对于不确定性或者非常重要的,一定先进行备份。当然你也可以自己重新定义一下rm命令,让它先执行备份操作,再进行删除。
#下面这个例子当${path}为空时,画面太美:你执行了rm –rf *
rm -rf ${path}/*
#下面同理,cd一旦失败,画面太美
cd to_del
rm -rf *
(9)就在我写完第8条,我差点重演了携程一幕。我要寻找一个名字中包含“test”字串的txt文件并删除,所以我想着该是这样的:
find /path –name “txt” -exec grep -l “test” {} \; -exec rm {}\;
我偏不,我一定要xargs:
find /path –name “txt” -exec grep -l “test” {} \; | xargs rm -rf
是的,我敲完命令的一瞬间就发现脑抽了,grep操作的是txt文件的内容而不是文件名,可怕的是我正好有一个txt文件中包含了很多脚本的路径。
假如让这个命令执行完,容易想到会导致什么:把文件内容里包含test的脚本全删除掉了。幸好及时的ctrl-c中断了命令,检查脚本,还都在。。。
接下来第一件事就是设置别名rm = ”rm -i” ,之后觉得不稳妥,将rm改为一个mv命令,将要删除的文件放置到tmp文件中,以后只需要crontab删除就好。。。至今仍心有余悸。