linux shell腳本對(duì)未定義變量的判斷以及if的用法詳解
環(huán)境
操作系統(tǒng):win10
虛擬機(jī):centos7
需求
因?yàn)楣居袀€(gè)腳本,是用于啟動(dòng)程序的,但是每次啟動(dòng)都要手動(dòng)做如下兩個(gè)操作:
①先查詢之前的進(jìn)程ID
②殺死之前的,在啟動(dòng)新了
時(shí)間長(zhǎng)了弄得我很煩躁,所以就琢磨下,把上面的的操作一起整合到啟動(dòng)腳本里去。
最開(kāi)始我是這么寫的:
#!/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:$!"
執(zhí)行了一下,OK
結(jié)果:
ggjob-search... having kill pid:7018 new pid:7209
假設(shè)進(jìn)程早已手動(dòng)殺死,在執(zhí)行上面的腳本:
結(jié)果提示:
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
雖然不影響后面的命令,依然啟動(dòng)了程序。但是總是報(bào)這個(gè)也不好看。
所以我打算加上if判斷
shell if寫法
if空格[空格判斷表達(dá)式空格];then
else
fi
對(duì)未定義變量的判斷
舉個(gè)例子:
if [ "x${pid}" != "x" ];then echo "說(shuō)明pid變量不為空" else echo "變量pid為空或未定義" fi
特別注意上面if那一行是沒(méi)有一個(gè)多余的空格;也就是說(shuō),空格是必須的,否則會(huì)報(bào)語(yǔ)法錯(cuò)誤。
最后我調(diào)整后的腳本為:
#!/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:$!"
簡(jiǎn)單講解:
①先執(zhí)行ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|awk '{printf $2}',找到我們要?dú)⑺赖倪M(jìn)程ID并賦值給變量pid。
②進(jìn)行判斷,要是進(jìn)程沒(méi)有被殺死,就執(zhí)行kill -9,進(jìn)行強(qiáng)制殺死進(jìn)程操作。
③后臺(tái)啟動(dòng)程序(我這里是啟動(dòng)jar包),最后打印啟動(dòng)的新ID。
注意:由于我的腳本名和查詢進(jìn)程名類似,所以grep取反時(shí),也要把腳本本身臨時(shí)啟動(dòng)的進(jìn)程ID過(guò)濾掉。
這里也貼出網(wǎng)上收集的一些小技巧:
判斷變量a為空最好的方法是:[ -z string ] [ -n string ] # 這種方式 if [ -z $a ];then echo "${LINENO} a is null" fi # -z 如果string長(zhǎng)度為零,則為真 # -n 如果string長(zhǎng)度非零,則為真
經(jīng)過(guò)我大量測(cè)試:
上面的對(duì)未定義變量的判斷也可以這么寫:
# 經(jīng)過(guò)我的測(cè)試使用-n 不能判斷未定義變量 if [ ! -z ${pid} ];then echo "說(shuō)明pid變量不為空" else echo "變量pid為空或未定義" fi
這是不是說(shuō)明:未定義變量,使用-n判斷時(shí),其string長(zhǎng)度不為空,使用-z做判斷時(shí),其string長(zhǎng)度為空。(我也不確定)
運(yùn)算符 | 描述 | 示例 |
---|---|---|
-e filename | 如果filename存在,則為真 | [ -e /etc/profile ] |
-d filename | 如果filename為目錄,則為真 | [ -d /tmp/mydir ] |
-f filename | 如果filename為常規(guī)文件,則為真 | [ -f /usr/bin/grep ] |
不一一列舉了!
以上這篇linux shell腳本對(duì)未定義變量的判斷以及if的用法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux中nohup和后臺(tái)運(yùn)行進(jìn)程查看及終止
今天給大家介紹linux中nohup和后臺(tái)運(yùn)行進(jìn)程查看及終止的操作命令,大家都知道nohup用于不掛斷地運(yùn)行命令,語(yǔ)法也很簡(jiǎn)單,需要的朋友可以參考下本文吧2021-06-06虛擬機(jī)中使用linux系啟用文件共享之后的文件存在的位置方法
下面小編就為大家?guī)?lái)一篇虛擬機(jī)中使用linux系啟用文件共享之后的文件存在的位置方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Shell腳本監(jiān)控目錄內(nèi)文件改動(dòng)
這篇文章主要介紹了Shell腳本監(jiān)控目錄內(nèi)文件改動(dòng),需要的朋友可以參考下2017-05-05shell腳本輸出多個(gè)主機(jī)的網(wǎng)卡速率的方法
這篇文章主要介紹了shell腳本輸出多個(gè)主機(jī)的網(wǎng)卡速率的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12shell腳本開(kāi)頭#!/bin/bash的作用詳解
在Shell腳本中,#!/bin/bash 是指定腳本使用 Bash 解釋器的 shebang 語(yǔ)句,它出現(xiàn)在腳本的第一行,并告訴操作系統(tǒng)使用 Bash 解釋器來(lái)執(zhí)行該腳本,這篇文章主要介紹了shell腳本開(kāi)頭#!/bin/bash的作用詳解,需要的朋友可以參考下2023-12-12