shell编程之case语句及函数
生活随笔
收集整理的這篇文章主要介紹了
shell编程之case语句及函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
shell編程之case語句
文章目錄
- shell編程之case語句
- 一、case語句
- 1. 語法結構
- 2. 應用案例
- 二、函數
- 1. 什么是函數?
- 2. 如何定義函數?
- 3. 函數如何調用?
- ㈠ 當前命令行調用
- ㈡ 定義到用戶的環境變量中
- ㈢ 腳本中調用
- 三、綜合案例
- 1. 任務背景
- 2. 具體要求
- 3. 綜合分析
- 4. 落地實現
一、case語句
關鍵詞:確認過眼神,你是對的人💑
1. 語法結構
說明:pattern表示需要匹配的模式 case var in 定義變量;var代表是變量名 pattern 1) 模式1;用 | 分割多個模式,相當于orcommand1 需要執行的語句;; 兩個分號代表命令結束 pattern 2)command2;; pattern 3)command3;;*) default,不滿足以上模式,默認執行*)下面的語句command4;; esac esac表示case語句結束2. 應用案例
㈠ 腳本傳不同值做不同事
具體需求: 當給程序傳入start、stop、restart三個不同參數時分別執行相應命令
#!/bin/env bash case $1 instart|S)service apache start &>/dev/null && echo "apache 啟動成功";;stop|T)service apache stop &>/dev/null && echo "apache 停止成功";;restart|R)service apache restart &>/dev/null && echo "apache 重啟完畢";;*)echo "請輸入要做的事情...";; esac㈡ 根據用戶需求選擇做事
具體需求:
腳本提示讓用戶輸入需要管理的服務名,然后提示用戶需要對服務做什么操作,如啟動,關閉等操作
#!/bin/env bash read -p "請輸入你要管理的服務名稱(vsftpd):" service case $service invsftpd|ftp)read -p "請選擇你需要做的事情(restart|stop):" actioncase $action instop|S)service vsftpd stop &>/dev/null && echo "該$serivce服務已經停止成功";;start)service vsftpd start &>/dev/null && echo "該$serivce服務已經成功啟動";;esac;;httpd|apache)echo "apache hello world";;*)echo "請輸入你要管理的服務名稱(vsftpd)";; esac㈢ 菜單提示讓用戶選擇需要做的事
具體需求:
模擬一個多任務維護界面;當執行程序時先顯示總菜單,然后進行選擇后做相應維護監控操作
**********請選擇********* h 顯示命令幫助 f 顯示磁盤分區 d 顯示磁盤掛載 m 查看內存使用 u 查看系統負載 q 退出程序 *************************思路:
落地實現:
二、函數
1. 什么是函數?
- shell中允許將一組命令集合或語句形成一段可用代碼,這些代碼塊稱為shell函數
- 給這段代碼起個名字稱為函數名,后續可以直接調用該段代碼的功能
2. 如何定義函數?
方法1:
函數名() {函數體(一堆命令的集合,來實現某個功能) }方法2:
function 函數名() {函數體(一堆命令的集合,來實現某個功能)echo helloecho world }函數中return說明:
3. 函數如何調用?
㈠ 當前命令行調用
[root@wolf shell04]# cat fun1.sh #!/bin/bash hello(){ echo "hello lilei $1" hostname } menu(){ cat <<-EOF 1. mysql 2. web 3. app 4. exit EOF }[root@wolf shell04]# source fun1.sh [root@wolf shell04]# . fun1.sh [root@wolf shell04]# hello 888 hello lilei 888 MissHou.itcast.cc [root@wolf shell04]# menu 1. mysql 2. web 3. app 4. exit㈡ 定義到用戶的環境變量中
[root@MissHou shell05]# vim ~/.bashrc 文件中增加如下內容: hello(){ echo "hello lilei $1" hostname } menu(){ cat <<-EOF 1. mysql 2. web 3. app 4. exit EOF }注意: 當用戶打開bash的時候會讀取該文件㈢ 腳本中調用
#!/bin/bash #打印菜單 source ./fun1.sh menu(){ cat <<-ENDh 顯示命令幫助f 顯示磁盤分區d 顯示磁盤掛載m 查看內存使用u 查看系統負載q 退出程序END } menu //調用函數##4. 應用案例
具體需求:
思路:
交互式定義多個變量來保存用戶信息 姓名、性別、年齡
如果不輸一直提示輸入
- 循環直到輸入字符串不為空 while 判斷輸入字符串是否為空
- 每個信息都必須不能為空,該功能可以定義為一個函數,方便下面腳本調用
根據用戶輸入信息做出匹配判斷
代碼實現:
#!/bin/bash #該函數實現用戶如果不輸入內容則一直循環直到用戶輸入為止,并且將用戶輸入的內容打印出來 input_fun() {input_var=""output_var=$1while [ -z $input_var ]doread -p "$output_var" input_vardoneecho $input_var }input_fun 請輸入你的姓名:或者 #!/bin/bash fun() {read -p "$1" varif [ -z $var ];thenfun $1elseecho $varfi }#調用函數并且獲取用戶的姓名、性別、年齡分別賦值給name、sex、age變量 name=$(input_fun 請輸入你的姓名:) sex=$(input_fun 請輸入你的性別:) age=$(input_fun 請輸入你的年齡:)#根據用戶輸入的性別進行匹配判斷 case $sex inman)if [ $age -gt 18 -a $age -le 35 ];thenecho "中年大叔你油膩了嗎?加油"elif [ $age -gt 35 ];thenecho "保溫杯里泡枸杞"elseecho "年輕有為。。。"fi;;woman)xxx;;*)xxx;; esac擴展延伸:
描述以下代碼含義: :() {:|:& } :三、綜合案例
1. 任務背景
現有的跳板機雖然實現了統一入口來訪問生產服務器,yunwei用戶權限太大可以操作跳板機上的所有目錄文件,存在數據被誤刪的安全隱患,所以希望你做一些安全策略來保證跳板機的正常使用。
2. 具體要求
3. 綜合分析
4. 落地實現
#!/bin/bash # jumper-server # 定義菜單打印功能的函數 menu() { cat <<-EOF 歡迎使用Jumper-server,請選擇你要操作的主機: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exitEOF } # 屏蔽以下信號 trap '' 1 2 3 19 # 調用函數來打印菜單 menu #循環等待用戶選擇 while true do # 菜單選擇,case...esac語句 read -p "請選擇你要訪問的主機:" host case $host in1)ssh root@10.1.1.1;;2)ssh root@10.1.1.2;;3)ssh root@10.1.1.3;;h)clear;menu;;q)exit;; esac done將腳本放到yunwei用戶家目錄里的.bashrc里執行: bash ~/jumper-server.sh exit進一步完善需求
為了進一步增強跳板機的安全性,工作人員通過跳板機訪問生產環境,但是不能在跳板機上停留。
#!/bin/bash #公鑰推送成功 trap '' 1 2 3 19 #打印菜單用戶選擇 menu(){ cat <<-EOF 歡迎使用Jumper-server,請選擇你要操作的主機: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit EOF }#調用函數來打印菜單 menu while true do read -p "請輸入你要選擇的主機[h for help]:" host#通過case語句來匹配用戶所輸入的主機 case $host in1|DB1)ssh root@10.1.1.1;;2|DB2)ssh root@10.1.1.2;;3|web1)ssh root@10.1.1.250;;h|help)clear;menu;;q|quit)exit;; esac done自己完善功能: 1. 用戶選擇主機后,需要事先推送公鑰;如何判斷公鑰是否已推 2. 比如選擇web1時,再次提示需要做的操作,比如: clean log 重啟服務 kill某個進程回顧信號:
1) SIGHUP 重新加載配置 2) SIGINT 鍵盤中斷^C 3) SIGQUIT 鍵盤退出 9) SIGKILL 強制終止 15) SIGTERM 終止(正常結束),缺省信號 18) SIGCONT 繼續 19) SIGSTOP 停止 20) SIGTSTP 暫停^Z總結
以上是生活随笔為你收集整理的shell编程之case语句及函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell编程之随机数和嵌套循环
- 下一篇: shell编程之正则表达式