环境
html" target="_blank">操作系统: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的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
问题内容: 我知道这是一个基本问题,但是我很好奇下面的代码为什么不起作用。没有用例不会声明此变量。 我得到错误 我确定这只是我还在学习的基本GOLANG内容。 谢谢你的支持 问题答案: 块有自己的范围。在您的情况下,它们在外部不可见。 您可以在修复前声明。 文件:https://golang.org/ref/spec#Declarations_and_scope 您可能还需要阅读:Go中的声明范围
本文向大家介绍Python判断变量是否已经定义的方法,包括了Python判断变量是否已经定义的方法的使用技巧和注意事项,需要的朋友参考一下 Python判断变量是否已经定义是一个非常重要的功能,本文就来简述这一功能的实现方法。 其实Python中有很多方法可以实现判断一个变量是否已经定义了。这里就举出最常用的两种作为示例,如下所示: 方法一:try except方法: 用法: 方法二:使用命名空间
本文向大家介绍Shell脚本中判断变量为数字的3种方法,包括了Shell脚本中判断变量为数字的3种方法的使用技巧和注意事项,需要的朋友参考一下 方法1:通过expr 计算变量与一个整数值相加,如果能正常执行则为整数,否则执行出错,$?将是非0的值 方法2:打印变量通过sed替换的方式,将变量中的数字替换为空,如果执行替换后变量为空,则为整数 如果判断负数则再用sed过滤负号 下面的脚本通过两个函数
本文向大家介绍javascript中对变量类型的判断方法,包括了javascript中对变量类型的判断方法的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String;复杂数据类型是Object,Object中还细分了很多具体的类型,比如:Array, Fun
问题内容: 在jQuery的核心风格指南建议两种不同的方法来检查一个变量是否被定义。 全局变量: 局部变量: 特性: 为什么jQuery为什么对全局变量使用一种方法而对局部变量和属性使用另一种方法? 问题答案: 对于未声明的变量,将返回字符串文字,而身份检查将触发错误 “未定义foo” 。 对于局部变量(您 知道 已在某处声明),不会发生此类错误,因此进行身份检查。
问题内容: 作为Go“ newb”,我 不确定 在编译程序时为什么会在控制台中收到 未定义err 和 未定义用户 的错误。 我有: 我意识到我可以在条件块之前声明and 变量,但是我想知道为什么这不起作用。与一次性创建两个新变量有关吗? UDPATE 对此有些混乱。 我现在有: 和我的错误现在是 用户声明的,不使用 。目前,我还没有解决 错误的 部分,但是我不确定为什么会遇到用户错误。 问题答案: