學習目標
掌握case語句的基本語法結構
掌握函數的定義以及調用
掌握常用的正則表達式元字符含義
一、case語句
case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。
case var in 定義變量;var代表變量名
pattern 1) 模式1;用|分割多個模式,相當于orcommand1 需要執行的語句;; 兩個;號代表命令結束
pattern 2) command2;;
pattern 3) command3;;*) default,不滿足以上模式,默認執行*)下面的語句command1;;
esac esac表示case語句結束
二、函數
shell中允許將一組命令集合或語句形成一段可用代碼,這些代碼塊稱為shell函數。給這段代碼起個名字稱為函數名,后續可以直接調用該段代碼的功能。
2.1函數定義
函數名()
{函數體(一堆命令的集合,來實現某個功能)}function 函數名()
{函數體(一堆命令的集合,來實現某個功能)
}function_name()
{commandcommand1...
}函數return說明“
1.return可以結束一個函數,類似于前面講的循環控制語句break(結束當前循環,執行循環體后面的代碼)
2.return默認返回函數中的最后一個命令的退出狀態,也可以給定參數值,該參數值的范圍是0-256之間
3.如果沒有return命令,函數將返回最后一個shell的退出值。
2.2應用案例
需求:寫一個腳本讓用戶輸入基本信息,性別,年齡,如不輸入一直提示輸入,最后根據用戶的信息輸出相對應的內容
思路:
循環直到輸入字符串不為空? (該功能可以定義為一個函數,方便下面腳本調用)
根據用戶輸入信息做出匹配判斷? case語句
#! /bin/bashfun(){
read -p "$1" name
if [ -z $name ];then
fun $1
else
echo $name
fi
}#調用函數并且獲取用戶的姓名,性別,年齡分別賦值給bane,sex,age
name=$(fun 請輸入姓名:)
sex=$(fun 請輸入性別:)
age=$(fun 請輸入年齡:)
echo $name
echo $sex
echo $age#根據用戶輸入的性別進行匹配判斷
case $sex inman)if [ $age gt 18 -a $age -le 35 ];thenecho "中年大叔"elif [ $age -gt 35 ];thenecho "保溫杯帶了嗎"elseecho "年輕有為"fi;;woman)if...fi;;*)....;;
三、綜合案例
任務背景:
現有的跳板機雖然實現了統一入口來訪問生產服務器,yunwei用戶權限太大可以操作跳板機上的所有目錄文件,存在數據被誤刪的安全隱患,所以希望做一些安全策略來保證跳板機的正常使用。
具體要求:
1.只允許yunwei用戶通過跳板機遠程鏈接后臺的應用服務器做一些維護操作
2.公司運維人員遠程通過yunwei用戶連接跳板機時,跳出一下菜單供選擇:
歡迎使用Jumper-server,請選擇你要操作的主機:
1.DB1-Master
2.DB2-Slave
3.Web1
4.Web2
h.help
q.exit
3.當用戶選擇相應主機后,直接免密碼登錄成功
4.如果用戶不輸入一直提示用戶輸入,直到用戶選擇退出
思路:
1.打印菜單-->定義函數? echo cat
2.讓用戶選擇需要操作的機器? case...esac
3.配置免密登錄
4.每個菜單提供功能-->case...esac用戶選擇做的事情
5.循環讓用戶輸入選擇
6.每個功能寫成函數-->不是必須的
7.腳本放的位置--->yunwei用戶的家目錄
#! /bin/bash
# jumper-server
#定義函數
#定義菜單打印功能的函數
trap '' 1 2 3 19
menu1()
{
cat <<-EOF
歡迎使用Jumper-server,請選擇你要操作的主機:
1.DB1-Master
2.DB2-Slave
3.Web1
4.Web2
h.help
q.exitEOF
}
menu2()
{
cat <<-EOF
歡迎使用web-server,請選擇你要操作的內容:
1.清理日志
2.啟動apache
3.重啟apache
h.help
q.exitEOF
}while true
do
clear
menu1
#用戶選擇相應的主機
read -p "請選擇你需要的主機(h for help):" host
case $host in1)ssh root@10.1.1.1;;2)ssh root@10.1.1.2;;3)clear;menu2read -p "請輸入你要操作的內容:" actionscase $actions in1)ssh root@10.1.1.1 echo "日志正在清理中";;2)ssh root@10.1.1.1 service apache start3)ssh root@10.1.1.1 service apache stop;;h)clear;menu2;;*)echo "請選擇操作內容";;esac;;h)clear;menu1;;q)exit;;
esac
done
四、正則表達式
1.什么是正則表達式
正則表達式是一種字符模式,用于在查找過程中匹配指定的字符
許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。
正則表達式這個概念最初是由unix中的工具軟件(例如sed和grep)普及開的。
支持正則表達式的程序如:locate | find | vim | grep | sed | awk
2.第一類正則
名詞解釋:
元字符:指哪些在正則表達式中具有特殊意義的專用字符,如:點(.)星(*)問號(?)等
前導字符:即位于元字符前面的字符? ?abc*? aooo.
正則中常用的元字符
(1). 任意單個字符,除了換行符
(2)* 前導字符出現0次或連續多次 ab*能匹配"a","ab"以及"abb",但是不匹配"cb"
(3).* 任意長度的字符 ab.*
(4)^ 行的開頭
(5)$ 行的結尾
(6)^$ 空行(7)[] 匹配指定字符組內的任一單個字符 [abc]
(8)[^] 匹配不在指定字符組內的任一字符 [^abc](9)^[] 匹配以指定字符組內的任一字符開頭 ^[abc]
(10)^[^]匹配不以指定字符組內的任一字符開頭 ^[^abc](11)\< 取單詞的頭
(12)\> 取單詞的尾
(13)\ <\> 精確匹配符號(14)\{n\} 匹配前導字符連續出現n次 go\{2\} google gooogle
(15)\{n,\} 匹配前導字符至少出現n次
(16)\{n,m\} 匹配前導字符出現n次與m次之間(17)\(xxx\) 保存被匹配的字符
perl內置正則:
\d 匹配數字 [0-9]
\w 匹配字母數字下劃線[a-zA-Z0-9_]
\s 匹配空格、制表符、換頁符[\t\r\n]#grep -P '\d' test.txt
#grep -P '\w' test.txt
#grep -P '\s' test.txt
擴展類的正則表達式grep -E或者egrep
擴展正則表達式元字符
+ 匹配一個或多個前導字符 bo+ boo bo
? 匹配零個或一個前導字符 bo? b bo
a|b 匹配a或b
() 組字符 hello myself yourself (my|your)self{n} 前導字符重復n次 \{n\}
{n,} 前導字符至少重復n次 \{n,\}
{n,m} 前導字符重復n到m次 \{n,m\}
3.第二類正則
表達式 | 功能 | 示例 |
[:alnum:] | 字母與數字字符 | [[:alnum:]]+ |
[:alpha:] | 字母字符,包括大小寫字母 | [[:alpha:]]{4} |
[:blank:] | 空格與制表符 | [[:blank:]]* |
[:digit:] | 數字 | [[:digit:]]? |
[:lower:] | 小寫字母 | [[:lower:]]{4,} |
[:upper:] | 大寫字母 | [[:upper:]]+ |
[:punct:] | 標點符號 | [[:punct:]] |
[:space:] | 包括換行符,回車等在內的所以空白 | [[:space:]]+ |