1. 程式人生 > 實用技巧 >shell之case語句與函式

shell之case語句與函式

一、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