shell脚本总结

/**/内的为注释
#!/bin/bash/*运行此shell的解释器为bash*/ #chkconfig: 2345 90 10/*chkconfig此服务时需要用到的,后面的代码则是service时要用到的,注意这里的2345是指这四种模式下启动linux均能够运行此服务(如GUI模式,无网络模式等等),而90是指启动后start的顺序,越小越优先start,如有a b两个服务其中a的start为1,b的是2,则linux启动后先启动a后启动b,systemd是最先启动的;start+kill值=100*/ #description: just a miao su. #variables redishome=/usr/local/redis redisserv=$redishome/bin/redis-server redisconf=$redishome/etc/redis.conf pidfile=$redishome/etc/redis.pid redisout=$redishome/redis.out #nohup的日志输出 #根据文件路径递归创建所需文件夹 my_mkdir(){ dirtmp=$1 dir=${dirtmp%/*}/*经过测试不能直接${$1%/*},不知道有谁有更好的办法吗,希望能告知*/ mkdir -p $dir/*类似java mkdirs*/ if [ ! $? -eq 0 ] ; then/*判断整型值,注意脚本语言都是弱类型,即字符串0和数值0其实是等价的,至少判断时是一样的*/ return 1 fi return 0 } my_touch(){ filetmp=$1 touch $1 if [ $? -ne 0 ] ; then/*$?是获取上个命令/脚本/函数的返回值,如return 1或exit 12 或echo aa的返回值;也可以用字符串的判断符号=,!=*/ return 1 fi return 0 } /*目前有整数判断option;字符串判断option和文件判断option*/ # ps -p $pid >/dev/null 2>&1是因为这里只需要获得ps -p $pid的返回值即可 # ,即查看是否存在pid的进程,而不需要输出或保存信息,故直接将输出重定向到 # /dev/null里,redis关闭时会清空pidfile start(){ if [ ! -z "$pidfile" ] ; then/*判断$pidfile这个变量是否有值,注意如果shell里有PATH=的语句则在此shell里$PATH就是无值的不会去环境变量里找;前面加个!表示对结果取非,也可以用-n代替 ! -z;注意这里需要有空格包括开始和结束的位置(;可以不用)*/ if [ -f "$pidfile" ] ; then/*判断此变量值是否存在对应的普通文件,-f可以理解为一个较为特殊的option,它是一个程序去以$pidfile为参数找这个文件存在且为普通文件返回true;否则返回false,注意没有0和1的说法,那是命令/脚本/函数的返回值*/ if [ -s "$pidfile" ] ; then/*和-f一样是个"程序命令"判断此文件是否为非空文件*/ echo "在启动redis时找到了非空的pid文件" if [ -r "$pidfile" ] ; then/*有可读权限,对应的-w和-x*/ pid=`cat "$pidfile"` ps -p $pid >/dev/null 2>&1/*通过>/dev/null 2>&1可以将控制台打印数据放入黑洞而不显示,但是命令已经执行;*/ if [ $? -eq 0 ] ; then #一定程度上可以实现进程的单例运行(写文件也是一种注册机制) echo "redis start aborted. 因为存在一个同样配置的redis进程已经开启" echo "如果这个进程并非redis,可以删除pid文件后再start" ps -fp $pid/*显示此进程的信息给客户端,以便其决策是否要kill此进程*/ exit 1 else #虽然启动时找到了pid文件但是没有和其对应的进程则可以认为是合理的,先删除这个文件,启动后再将pid写入它 echo "删除老的pid文件" rm -f "$pidfile" >/dev/null 2>&1 if [ $? != 0 ]; then if [ -w "$pidfile" ]; then cat /dev/null > "$pidfile" /*注意/dev/null是个特殊的空文件*/ #这句话的意思是如果pidfile可读就将null文件[0byte]写到pidfile里 else echo "无法移除或清空pidfile,启动被打断" exit 1 fi fi fi #结束判断是否有对应的pid进程 fi #结束判断是否可读 fi #结束文件是否是空文件 fi #结束是否是文件的判断,这个其实也可以不要,本来要else然后移除然后添加文件的,省略。 fi #结束pidfile是否有值的判断,这里恒有值故不需要else #注意,如果在这里加个shift,则后面的脚本里原本是$2的将会变成$1 shift touch "$redisout" #创建控制台信息的重定向文件 #echo "测试用:${#}",注意,这里报错的原因是"$#"将数值转换为了字符串故类型不匹配报错,去掉""即可,或者用=号比较 if [ "$#" -eq 0 ] ; then #控制启动redis时不能有多余参数 /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf >>$redisout 2>&1 pidval="$!" fi if [ -n $pidfile ]; then echo "将pid${pidval}注册到文件" my_mkdir $pidfile my_touch $pidfile echo $! > $pidfile/*更新pid到pidfile里*/ fi echo "Redis started" } /*注意,我的这个stop是有问题的,因为我的redis设置了daemon模式,故当他启动后会创建子进程退出主进程实现daemon,所以$!是拿不到子进程的pid的,还是通过客户端命令实现关闭服务这里只是做shell命令总结就不改了*/ stop(){ #是否为普通文件的就懒得判断了,注意-f是两重判断:是否存在且是普通文件 if [ ! -z "$pidfile" ]; then if [ -s "$pidfile" ]; then #kill -0 的据说只能用来测试是否存在进程,然而应该不是ps -p pid才是 #kill -0 `cat "$pidfile"` >/dev/null 2>&1 #testtt=$? #echo "test,test ${testtt}" kill -15 `cat "$pidfile"` >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "存在非空pid文件,但是对应的进程没有找到或者没有权限停止它" exit 1 else echo "关闭redis服务成功" fi else echo "有配置pidfile,但是file为空不知道该关闭哪个进程故忽略" fi rm -f $pidfile >/dev/null 2>&1 fi } case "$1" in start|stop) $1 ;; *) echo "不支持其它操作" esac

 1.如果要A执行成功才执行B则可以用 commandA && commandB(如mkdir /opt/ss && cd /opt/ss)

如果执行成功了A则不执行B,A失败了才执行B则用commandA || commandB

如果A和B是等价的都需要执行,则commandA;commandB

2.cp和cp的区别在于前者不会询问,一般我们写一些强制要执行的脚本就是用cp -rf sss.zip xx/这种

原文地址:https://www.cnblogs.com/silentdoer/p/8726897.html