shell之case語句與函式
阿新 • • 發佈:2020-12-28
一、case語句
1.1 語法結構
case var in 定義變數;var代表是變數名 pattern 1) 模式1;用 | 分割多個模式,相當於or command1 需要執行的語句 ;; 兩個分號代表命令結束 pattern 2) command2 ;; pattern 3) command3 ;; *) default,不滿足以上模式,預設執行*)下面的語句 command4 ;; esac esac表示case語句結束 #pattern表示需要匹配的模式
1.2 應用案例
1)指令碼傳不同值做不同事
① 需求:
當給程式傳入start、stop、restart三個不同引數時分別執行相應命令!
② 實現:
#!/bin/bash case $1 in start|S) service httpd start &> /dev/null && echo "httpd 啟動成功" ;; stop|T) service httpd stop &> /dev/null && echo "httpd 停止成功" ;; restart|R) service httpd restart &> /dev/null && echo "httpd 重啟成功" ;; *) echo "請輸入對應的值(start|stop|restart)……" ;; esac
2)根據使用者需求選擇做事
① 需求:
指令碼提示讓使用者輸入需要管理的服務名,然後提示使用者需要對服務做什麼操作,如啟動,關閉等操作!
② 實現:
#!/bin/bash read -p "請輸入你需要管理的服務名稱(httpd|vsftpd):" service case $service in vsftpd|ftp) read -p "請選擇需要執行的指令(start|stop|restart):" action1 case $action1 in start) service vsftpd start &> /dev/null && echo "${service}服務已經啟動成功" ;; stop) service vsftpd stop &> /dev/null && echo "${service}服務已經停止成功" ;; restart) service vsftpd restart &> /dev/null && echo "${service}服務已經重啟成功" ;; esac ;; httpd|apache) read -p "請選擇需要執行的指令(start|stop|restart):" action2 case $action2 in start) service httpd start &> /dev/null && echo "${service}服務已經啟動成功" ;; stop) service httpd stop &> /dev/null && echo "${service}服務已經停止成功" ;; restart) service httpd restart &> /dev/null && echo "${service}服務已經重啟成功" ;; esac ;; esac
3)選單提示讓使用者選擇需要做的事
① 需求:
模擬一個多工維護介面,當執行程式時先顯示總選單,然後進行選擇後做相應的操作!如下:
**********請選擇*********
h 顯示命令幫助
f 顯示磁碟分割槽
d 顯示磁碟掛載
m 檢視記憶體使用
u 檢視系統負載
q 退出程式
*************************
② 實現:
#!/bin/bash
#列印選單
menu(){
cat <<END
h 顯示命令幫助
f 顯示磁碟分割槽
d 顯示磁碟掛載
m 檢視記憶體使用
u 檢視系統負載
q 退出程式
END
}
menu
while true
do
read -p "請輸入你的操作[h for help]:" var1
case $var1 in
h)
menu
;;
f)
read -p "請輸入你要檢視的裝置名字[/dev/sdb]:" var2
case $var2 in
/dev/sda)
fdisk -l /dev/sda
;;
/dev/sdb)
fdisk -l /dev/sdb
;;
esac
;;
d)
lsblk
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
esac
done
二、函式
2.1 函式簡介
- shell中允許將一組命令集合或語句形成一段可用程式碼,這些程式碼成為shell函式;
- 給這段程式碼起個名稱成為函式名,後續可以直接呼叫這段程式碼的功能;
2.2 定義函式
1)方法一
函式名()
{
函式體(一堆命令的集合,來實現某個功能)
}
2)方法二
function 函式名()
{
函式體(一堆命令的集合,來實現某個功能)
echo hello
echo world
}
函式中return說明:
1)return可以結束一個函式。類似於迴圈控制語句break結束當前迴圈。執行迴圈體後的程式碼;
2)return預設返回函式中最後一個命令狀態值,也可給定引數值,範圍是0~256之間;
3)如果沒有return命令,函式將返回最後一個指定的退出狀態值;
2.3 呼叫函式
1)當前命令列呼叫
$ vim 1.sh
#!/bin/bash
hello(){
echo “hello lzj $1”
hostname
}
menu(){
cat <<-EOF
1.mysql
2.web
3.app
4.exit
EOF
}
$ source 1.sh
$ hello 888
“hello lzj 888”
localhost.localdomain
$ menu
1.mysql
2.web
3.app
4.exit
2)定義到使用者的環境變數中
$ vim ~/.bashrc
檔案中增加如下內容:
hello(){
echo "hello lzj $1"
hostname
}
menu(){
cat <<-EOF
1. mysql
2. web
3. app
4. exit
EOF
}
注意:當用戶開啟bash的時候會讀取該檔案
3)指令碼中呼叫
$ vim 2.sh
#!/bin/bash
#列印選單
source ./1.sh
menu(){
cat <<-EOF
h 顯示幫助
f 顯示磁碟分割槽
d 顯示磁碟掛載
m 檢視記憶體使用
u 檢視系統負載
q 退出程式
EOF
}
menu
$ sh 2.sh
h 顯示幫助
f 顯示磁碟分割槽
d 顯示磁碟掛載
m 檢視記憶體使用
u 檢視系統負載
q 退出程式
4)應用示例
① 需求:
1)寫一個指令碼收集使用者輸入的基本資訊(姓名、性別、年齡)。如果不輸入,一直提示輸入;
2)最後根據使用者的資訊輸出相對應的內容;
② 實現:
#!/bin/bash
#該函式實現使用者如果不輸入內容則一直迴圈知道使用者輸入位置,並且將使用者輸入的內容打印出來
input_fun(){
input_var=""
output_var=$1
while [ -z $input_var ]
do
read -p "$output_var" input_var
done
echo $input_var
}
#呼叫函式並且獲取使用者的姓名、性別、年齡分別負責賦值給name、sex、age
name=$(input_fun 請輸入您的姓名:)
sex=$(input_fun 請輸入您的性別:)
age=$(input_fun 請輸入您的年齡:)
#根據使用者輸入的性別進行匹配判斷
case $sex in
man)
if [ $age -gt 18 -a $age -le 35 ];then
echo "年輕有為!加油"
elif [ $age -gt 35 ];then
echo "有點老了"
else
echo "太小了!"
fi
;;
woman)
echo "小姐姐"
;;
esac