shell 十 case的幾個典型應用

2021-09-26 19:05:28 字數 4031 閱讀 4667

一   說明

case語句專門寫服務的

啟動指令碼

二    案例

多種方式:rhel7的systemed的管理方式和rhel6的/etc/init.d的管理方式

注意:對於既沒有通過systemd管理的,並且也沒有提供可以放到/etc/init.d/下的啟動指令碼,就需要自己手動完成了!

(1)開發nginx的啟動指令碼並加入開機自啟的指令碼

需求:通過case指令碼模擬nginx服務啟動關閉

/etc/init.d/nginx

#!/bin/bash

# 開機啟動順序

# ll /etc/rc.d/rc3.d/|grep 22 -->22可以(數字越靠前,優先順序越高)-->開機和關閉的順序

# 思路:定義三個模組(函式),然後case語句呼叫模組,實現相應的功能!

#(1)判斷shell自帶的庫函式是否存在-->有則載入

[ -f /etc/init.d/functions ] && source /etc/init.d/functions

#(2)判斷程序是否開啟(nginx是否開啟)-->pid檔案-->裡面有程序號或者埠(不靠譜)

pid_file=/usr/local/lnmp/nginx/logs/nginx.pid

#(3)定義函式-->模組

#(1)開啟服務

start_nginx()

#(2)關閉服務

stop_nginx()

#(3)重啟服務

restart_nginx()

reload_nginx()

##############case語句###################

case $1 in

start)

start_nginx

retval=$?

;; stop)

stop_nginx

retval=$?

;; restart)

# 另外一中方法-->先stop,然後再start-->這裡用了系統指令碼自帶的

restart_nginx

retval=$?

;; reload)

reload_nginx

retval=$?

;; *)

# 錯誤提示

echo "usage:$0 "

exit 1

esac

exit $retval

開機啟動

chmod a+x /etc/init.d/nginx   

[root@server1 init.d]# ll /etc/rc.d/rc3.d/

total 0

lrwxrwxrwx. 1 root root 20 aug 14 18:56 k50netconsole -> ../init.d/netconsole

lrwxrwxrwx. 1 root root 17 aug 14 18:56 s10network -> ../init.d/network

lrwxrwxrwx 1 root root 15 sep 2 18:57 s32nginx -> ../init.d/nginx

lrwxrwxrwx. 1 root root 15 aug 14 18:56 s97rhnsd -> ../init.d/rhnsd

# 開啟和關閉對應的數字沒有被占用即可!

chkconfig --add nginx

chkconfig --list nginx

# 開機自啟動

chkconfig nginx on

# reboot --->測試!

# 不用vim /etc/rc.d/rc.local 的方式編輯的方式!

後續

#(1)小細節

把/usr/local/lnmp/nginx/sbin/nginx命令作為乙個變數儲存,然後下面引用

#(2) 把冗餘的封裝成乙個函式-->某個名稱執行是否成功

wzj()

# 呼叫方式--->傳遞引數

wzj $1

關於chkconfig

# 7個執行級別對應的啟動指令碼! --> /etc/目錄下

drwxr-xr-x. 2 root root 77 sep 2 18:55 rc0.d

drwxr-xr-x. 2 root root 77 sep 2 18:55 rc1.d

drwxr-xr-x. 2 root root 77 sep 2 18:57 rc2.d

drwxr-xr-x. 2 root root 77 sep 2 18:57 rc3.d

drwxr-xr-x. 2 root root 77 sep 2 18:57 rc4.d

drwxr-xr-x. 2 root root 77 sep 2 18:57 rc5.d

drwxr-xr-x. 2 root root 77 sep 2 18:55 rc6.d

# 含義

等級0表示:表示關機

等級1表示:單使用者模式

等級2表示:無網路連線的多使用者命令列模式

等級3表示:有網路連線的多使用者命令列模式

等級4表示:不可用

等級5表示:帶圖形介面的多使用者模式

等級6表示:重新啟動

執行級檔案

# 每個被chkconfig管理的服務需要在對應的init.d下的指令碼加上兩行或者更多行的注釋

(1)第一行告訴chkconfig預設啟動的執行級以及啟動和停止的優先順序,如果某服務預設不在任何執行級啟動,那麼使用 – 代替執行級。

(2)第二行對服務進行描述,可以用\ 跨行注釋

# 數字越靠前,關閉越靠前!

###########################################

# 驗證:如何下次開機確定是再32開啟和62關閉

# 本質建立連線檔案

[root@server1 init.d]# ll /etc/rc3.d/ |grep 32

lrwxrwxrwx 1 root root 15 sep 2 18:57 s32nginx -> ../init.d/nginx #start

常用的命令

chkconfig --del nginx

chkconfig --list nginx # 檢視此服務的選項

chkconfig --add nginx # 加入開機管理中

chkconfig nginx off # 開機不自啟

ll /etc/rc3.d/ | grep nginx # 檢視優先順序,以及是否建立對應的軟鏈結

chkconfig nginx on # 開機自啟

service、systemctl、chkconfig

(2)mysql

要求:用函式、if語句、case語句實現mysql單例項或多例項啟動關閉指令碼的編寫!

(3)rsync--->有時間沒有

系統指令碼的研習:/etc/init.d/network

#(1)用雙引號

case "$1" in

#(2)用命令回傳碼

rc=$?

/etc/init.d/functions

應用案例

Shell中的case命令

case語句和判斷語句 if.elif.else 功能類似 當在邏輯判斷比較簡單的情況下,比後者的 量要少許多.case用法,用變數來匹配某值,如果匹配成功則執行它下面的命令,直到 為止 bin bash a 20 定義變數值 case a in 若變數在下面的某值中,則執行它下面的命令 10 值內...

shell的典型應用 shell的高亮顯示

基本格式 echo e 終端顏色 顯示的內容 結束後的顏色 例項 1 echo e e 1 66m i am handsome e 1 0m 其中 e 1 66m中的1表示設定終端顏色,如果為0則不設定終端顏色 2 echo e e 1 66m i am handsome tput sgr0 tpu...

幾個sql語句中的case使用

表結構 field type null key default extra id int 11 no pri name varchar 20 yes null char 1 yes null addr varchar 50 yes null 1.select id,name case when m ...