zoukankan      html  css  js  c++  java
  • 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/这种

  • 相关阅读:
    LeetCode Binary Tree Inorder Traversal
    LeetCode Populating Next Right Pointers in Each Node
    LeetCode Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode Reverse Linked List II
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Pascal's Triangle
    Palindrome Construct Binary Tree from Preorder and Inorder Traversal
    Pascal's Triangle II
    LeetCode Word Ladder
    LeetCode Binary Tree Zigzag Level Order Traversal
  • 原文地址:https://www.cnblogs.com/silentdoer/p/8726897.html
Copyright © 2011-2022 走看看