• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    linux shell脚本对未定义变量的判断以及if的用法详解

    环境

    操作系统:win10

    虚拟机:centos7

    需求

    因为公司有个脚本,是用于启动程序的,但是每次启动都要手动做如下两个操作:

    ①先查询之前的进程ID

    ②杀死之前的,在启动新了

    时间长了弄得我很烦躁,所以就琢磨下,把上面的的操作一起整合到启动脚本里去。

    最开始我是这么写的:

    #!/bin/bash
    echo "ggjob-search..."
    pid=`ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}'`
    echo "having kill pid:$pid"
    kill -9 $pid
    nohup java -Djava.ext.dirs=lib -Xms500m -Xmx500m -Dlog4j.configuration=file:/home/webuser/gogoal_platform/ggjob/config/log4j.properties -jar ggjob-search.jar config/config.properties 2>1 >>/dev/null 
    echo "new pid:$!"

    执行了一下,OK

    结果:

    ggjob-search...
    having kill pid:7018
    new pid:7209

    假设进程早已手动杀死,在执行上面的脚本:

    结果提示:

    kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

    虽然不影响后面的命令,依然启动了程序。但是总是报这个也不好看。

    所以我打算加上if判断

    shell if写法

    if空格[空格判断表达式空格];then
    else
    fi

    对未定义变量的判断

    举个例子:

    if [ "x${pid}" != "x" ];then
    echo "说明pid变量不为空"
    else
    echo "变量pid为空或未定义"
    fi

    特别注意上面if那一行是没有一个多余的空格;也就是说,空格是必须的,否则会报语法错误。

    最后我调整后的脚本为:

    #!/bin/bash
    echo "ggjob-search..."
    pid=`ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}'`
    if [ "X${pid}" != "X" ];then
    echo "having kill pid:$pid"
    kill -9 $pid
    fi
    nohup java -Djava.ext.dirs=lib -Xms500m -Xmx500m -Dlog4j.configuration=file:/home/webuser/gogoal_platform/ggjob/config/log4j.properties -jar ggjob-search.jar config/config.properties 2>1 >>/dev/null 
    echo "new pid:$!"

    简单讲解:

    ①先执行ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}',找到我们要杀死的进程ID并赋值给变量pid。

    ②进行判断,要是进程没有被杀死,就执行kill -9,进行强制杀死进程操作。

    ③后台启动程序(我这里是启动jar包),最后打印启动的新ID。

    注意:由于我的脚本名和查询进程名类似,所以grep取反时,也要把脚本本身临时启动的进程ID过滤掉。

    这里也贴出网上收集的一些小技巧:

    判断变量a为空最好的方法是:[ -z string ] [ -n string ]
    # 这种方式
    if [ -z $a ];then
    echo "${LINENO} a is null"
    fi
    # -z 如果string长度为零,则为真
    # -n 如果string长度非零,则为真

    经过我大量测试:

    上面的对未定义变量的判断也可以这么写:

    # 经过我的测试使用-n 不能判断未定义变量
    if [ ! -z ${pid} ];then
    echo "说明pid变量不为空"
    else
    echo "变量pid为空或未定义"
    fi

    这是不是说明:未定义变量,使用-n判断时,其string长度不为空,使用-z做判断时,其string长度为空。(我也不确定)

    运算符 描述 示例
    -e filename 如果filename存在,则为真 [ -e /etc/profile ]
    -d filename 如果filename为目录,则为真 [ -d /tmp/mydir ]
    -f filename 如果filename为常规文件,则为真 [ -f /usr/bin/grep ]

    不一一列举了!

    以上这篇linux shell脚本对未定义变量的判断以及if的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Linux shell条件判断if中的-a到-z的意思【推荐】
    • Shell中if的基本语法和常见判断用法
    • Shell脚本IF条件判断和判断条件总结
    • Linux shell脚本编程if语句的使用方法(条件判断)
    • linux shell中if的各种判断
    上一篇:对shell中常见参数及判断命令介绍
    下一篇:在linux上定期执行命令、脚本(cron,crontab,anacron)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    linux shell脚本对未定义变量的判断以及if的用法详解 linux,shell,脚本,对,未定义,