脚本专栏 
首页 > 脚本专栏 > 浏览文章

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

(编辑:jimmy 日期: 2024/11/26 浏览:3 次 )

环境

操作系统: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的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

上一篇:shell日志颜色处理及清理系统日志的方法
下一篇:shell脚本之判断输入参数是否为整数值的实例
一句话新闻
一文看懂荣耀MagicBook Pro 16
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?
友情链接:杰晶网络 DDR爱好者之家 南强小屋 黑松山资源网 白云城资源网 网站地图 SiteMap