shell腳本第五階段---shell函數與正則表達式

學習目標

掌握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:]]+

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97630.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97630.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

164.在 Vue3 中使用 OpenLayers 加載 Esri 地圖(多種形式)

適配&#xff1a;Vue 3 Vite TypeScript&#xff08;也兼容 JS&#xff09; 地圖引擎&#xff1a;OpenLayers v10 目標&#xff1a;一次性學會 多種 Esri 底圖加載方式、注記疊加、動態切換、令牌&#xff08;Token&#xff09;鑒權、常見坑位排查。一、效果預覽二、為什么選…

深入了解Flink核心:Slot資源管理機制

TaskExecutor、Task 和 Slot 簡單來說&#xff0c;它們的關系可以比作&#xff1a;TaskExecutor&#xff1a;一個工廠&#xff0c;擁有固定的生產資源。TaskSlot&#xff1a;工廠里的一個工位。每個工位都預先分配了一份獨立的資源&#xff08;主要是內存&#xff09;。Task&am…

java web 練習demo。生成簡單驗證碼前端是jsp

目錄結構 demo\ ├── WEB-INF\ │ └── weblogic.xml # WebLogic服務器配置文件 ├── demo.iml # IntelliJ IDEA項目配置文件 ├── lib\ # Java EE核心依賴庫 │ ├── javax.annotation.jar │ ├── javax.ejb.jar │ ├── javax.…

擁抱智能高效翻譯 ——8 款視頻翻譯工具深度測評

前陣子幫知識博主做跨境視頻翻譯&#xff0c;踩了不少坑&#xff1a;把 “內卷” 直譯成 “involution” 讓海外觀眾困惑&#xff0c;多語種版本趕工 3 天只出 2 種&#xff0c;還得手動核對 “碳中和”“非遺” 這類特色詞的譯法&#xff1b;用傳統工具譯完&#xff0c;視頻要…

[知識點記錄]SQLite 數據庫和MySQL 數據庫有什么區別?

核心區別&#xff1a;一個“內嵌”&#xff0c;一個“獨立”SQLite (你的個人筆記本)本質&#xff1a; 它是“無服務器”的&#xff0c;或者叫“內嵌式”數據庫。它不需要一個獨立的程序一直在后臺運行。你的應用程序&#xff08;比如Strapi&#xff09;直接就能讀寫它的數據庫…

【Spark Core】(二)RDD編程入門

目錄1 程序入口&#xff1a;SparkContext對象2 RDD的創建2.1 本地創建2.2 讀取文件創建3 RDD算子4 常用Transform算子4.1 map算子4.2 flatMap算子4.3 reduceBykey算子4.4 mapValues算子<實例> WordCount4.5 groupBy算子4.6 filter算子4.7 distinct算子4.8 union算子4.9 j…

java IDEA run/Debug異常:“jdk1.8injava.exe“ CreateProcess error=206, 文件名或擴展名太長

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#,Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發…

Java 函數編程之【過濾器filter()合并】【predicate(斷言)】與【謂詞邏輯】

Java函數式編程之【過濾器filter合并】【predicate&#xff08;斷言&#xff09;】與【謂詞邏輯】一、合并多個過濾器filter &#xff08;Lambda版本&#xff09;二、合并多個過濾器filter &#xff08;謂詞邏輯&#xff08;Predicate&#xff09;版本&#xff09;&#xff08;…

CentOS10安裝RabbitMQ

1.下載資源 &#xff08;1&#xff09;下載erlang-rpm 注意&#xff1a;按照圖片中的下載&#xff0c;用綠色三角形指向的是重點關注的。 網址&#xff1a; erlang-rpmhttps://github.com/rabbitmq/erlang-rpm/releases &#xff08;2&#xff09;下載rabbitmq-server 注…

JVM——八股文

1. JDK, JRE和JVM的關系JDK JRE Java開發工具JRE JVM Java核心類庫JDK供Java程序開發人員開發軟件&#xff0c;JRE供客戶使用&#xff0c;只需要JVM運行環境即可。JVM運行的是class字節碼&#xff0c;不僅能運行Java代碼&#xff0c;還能運行其他語言&#xff0c;只要語言能…

騎行把帶定期換,維樂 Skin Wrap 把帶煥新騎行

在公路騎行的裝備體系里&#xff0c;把帶是最易被忽視卻至關重要的“消耗品”。它是騎手手部與車身的直接連接&#xff0c;每一次轉向、變速、剎車&#xff0c;都需通過把帶傳遞力量與操控意圖&#xff1b;同時&#xff0c;它還承擔著吸汗、減震、保護車把的作用。可長期使用后…

LeetCode100-73矩陣置零

本文基于各個大佬的文章 上點關注下點贊&#xff0c;明天一定更燦爛&#xff01; 前言 Python基礎好像會了又好像沒會&#xff0c;所有我直接開始刷leetcode一邊抄樣例代碼一邊學習吧。本系列文章用來記錄學習中的思考&#xff0c;寫給自己看的&#xff0c;也歡迎大家在評論區指…

寧波市第八屆網絡安全大賽 -- Crypto -- WriteUp

寧波市第八屆網絡安全大賽 – Crypto – WriteUp Three-prime RSA task import gmpy2 from Crypto.Util.number import *from secret import flagp getPrime(512) q getPrime(512) r getPrime(512) n p * q * r random_num getPrime(28) D ((p q r) * random_num) % n …

大語言模型 (LLM) 與多模態大模型 (MLM)

文章目錄概述&#xff1a;從“模型”到“大”模型1、大語言模型 (Large Language Model, LLM)1.1 定義與概述關鍵特征&#xff1a;1.2 核心技術與架構Transformer架構自注意力機制 (Self-Attention)1.3 訓練過程1.4 工作原理2. 多模態大模型 (Multimodal Large Model, MLM)2.1 …

HTML應用指南:利用GET請求獲取全國招商銀行網點位置信息

招商銀行&#xff08;China Merchants Bank, CMB&#xff09;作為中國領先的股份制商業銀行&#xff0c;始終堅持“以客戶為中心”的服務理念&#xff0c;致力于為個人客戶、企業客戶及機構客戶提供專業、高效、便捷的綜合金融服務。依托“輕型銀行”戰略與“金融科技銀行”建設…

JVM性能監控工具的使用

了解JVM性能監控工具并能熟練使用&#xff0c;是Java開發者進階的必備技能。下面本文將為你介紹一些主流的JVM性能監控工具及其使用方法&#xff0c;并通過一些場景案例來分析如何應用這些工具解決實際問題。 &#x1f6e0;? JVM性能監控與調優工具指南 ? 工具概覽 以下是幾款…

【工作】一些找工作需要了解避雷的知識

面試前 1.公司的具體情況 公司全稱&#xff0c;辦公地點&#xff0c;涉及崗位 要求hr做個簡單的公司介紹 2.崗位職責/業務方向 工作內容、公司業務 3.薪資待遇&#xff0c;構成&#xff0c;底薪&#xff0c;五險一金 問一下工資范圍 底薪 &#xff08;有責&#xff0c;無…

五、練習2:Git分支操作

練習2&#xff1a;Git分支操作 練習目標 掌握Git分支的創建、切換、合并等操作&#xff0c;理解分支在開發中的作用。 練習步驟 步驟1&#xff1a;準備基礎倉庫 # 創建練習目錄 mkdir branch-practice cd branch-practice# 初始化倉庫 git init# 創建初始文件 echo "# 分支…

【筆記】算法設計:異或空間線性基

Content1.什么是異或&#xff08;定義和性質&#xff09;2.異或空間線性基的構造方法3.異或空間線性基的應用4.算法設計例舉5.小結說明算法設計應用之前&#xff0c;首先明確異或空間線性基&#xff1a;一種數據結構。用于處理異或關系&#xff08;運算&#xff09;下的向量空間…

Filebeat采集數據與日志分析實戰

&#x1f31f;Filebeat采集數據的原理 Filebeat默認按行采集數據&#xff0c;如果數據沒有換行&#xff0c;則該條數據無法采集到 屬于有狀態服務&#xff0c;可以記錄上一次采集數據的位置點信息 修改配置文件 vim /etc/filebeat/config/03-log-to-console.yaml filebeat.inp…