Linux shell腳本進階使用

来源:https://www.cnblogs.com/heyongshen/archive/2022/07/12/16472084.html
-Advertisement-
Play Games

shell的迴圈控制語句 - continue:提前結束某次迴圈,重新開始下一次 - break:提前結束某層迴圈 範例: #求100以內的奇數和 #!/bin/bash sum=0 for i in `seq 100`;do if [ $[i%2] -ne 0 ];then continue el ...


shell的迴圈控制語句

-  continue:提前結束某次迴圈,重新開始下一次

-  break:提前結束某層迴圈

範例:

#求100以內的奇數和
#!/bin/bash
sum=0
for i in `seq 100`;do
  if [ $[i%2] -ne 0 ];then
  	continue
       else
              let sum+=$i
       fi
done
echo $sum
#實現100以內的奇數和
#!/bin/bash
sum=0
for i in `seq 100`;do  #``:命令替換
   if [ $[i%2] -eq 0 ];then  #$[]:shell的算數語法
         let sum+=$i #let工具需要藉助一個變數存儲計算後的值
        fi
done

echo $sum

shell的迴圈控制 shift 命令

每執行一次shift命令,都會左移一次。

#比如有三個參數$1 $2 $3,執行一次shift命令後,$1就刪除了,$2變成$1,一次類推。
#!/bin/bash
echo $*
shift
echo $*
shift
echo $*
shift
#輸出結果:
[root@Centos8 ~]# bash shift.sh 1 2 3 4 5
1 2 3 4 5
2 3 4 5
3 4 5
#利用shift的方式批量創建賬號
#!/bin/bash

if [$# -eq 0];then  #判斷位置參數是否是0
	echo "請輸入需要創建的用戶"
	exit
fi

while [ "$1"  ] ;do #[ "$1"  ]:判斷$1是否為空,只寫字元串就表示字元串不為空,為真
	if id $1 &> /dev/null; then  #如果id命令執行的結果為真($?=0)就表示用戶存在了
		echo "$1 is exist"
	else
		useradd $1
		echo "$1 is create"
	fi
	shift
done
echo "all user is create "

#使用for的形式創建賬號
if [$# -eq 0];then  #判斷位置參數是否是0
	echo "請輸入需要創建的用戶"
	exit
fi

for user in $*;do
if id $user &> /dev/null; then  #如果id命令執行的結果為真($?=0)就表示用戶存在了
		echo "$user is exist"
	else
		useradd $user
		echo "$user is create"
	fi
done
echo "all user is create "

while 特殊用法 while read

文本的逐行處理。

格式

while read line; do
 迴圈體
done < /PATH/FROM/SOMEFILE
while read line ;do echo $line; done #標準輸入,逐行處理

while read line ; do xxxx; done < filename #可以利用標準輸入重定向把文件傳給它

cat /etc/issue | while read line ;do echo $line; done #用管道

#使用while read判斷磁碟分區磁碟的利用率
#!/bin/bash

while true ; do #一直執行
   df | sed -nr '/^\/dev\/sd/ s#([^ ]+).*([0-9]+)%.*#\1 \2#p' | while read  DEV USE;do 
   if [ $USE -gt 80 ];then 
	 echo "$DEV will be full, USE: $USE"
   else
	 echo "$DEV is health, USE: $USE"
   fi
   done
sleep 2 #每兩秒執行一次
done

#sed -nr '/^\/dev\/sd/ s#(^[^ ]+).*([0-9]+)%.*#\1 \2#p' | while read  DEV USE;do
#/^\/dev\/sd/ --- 以為/dev/sd開頭的(非空格的內容)
#[^ ]+ :取出分區的設備,非空格,一個以上的字元
#\1 \2 --- 後項替換
#查看/sbin/nologin的shell類型的用戶名和UID
#!/bin/bash
while read line ; do #通過輸入重定向的方式逐行處理內容
	if [[ $line =~ /sbin/nologin$  ]];then # [[ =~ ]]:會把會把右邊的字元串當成正則
		echo $line | cut -d: -f1,3 # -d:指定分隔符 -f:取那幾列
        fi
done < /etc/passwd


迴圈與菜單 select

幫助我們生成菜單的作用。

格式:

#語法和for的語法很類似
select 變數 in 列表 ;do
	所作的操作
done

#PS3用於輸出提示信息,效果等同於 read -p
#輸入的信息保存到置變數REPLY中
#select 是個無限迴圈,因此要用 break 命令退出迴圈

#PS1:是影響我們當前提符的
#PS2:影響多行多定向(<<)提示符的 echo $PS2--> >
#列表就是用來生成菜單的
PS3="請選擇功能(1-5):" #PS3:更改菜單的提示信息
select list in 升級軟體 備份資料庫 回滾軟體 刪庫跑路 ; do
	echo $REPLY;
done
#!/bin/bash

PS3="請輸入對應選項(1-5): "

select menu in 安裝 升級 配置 卸載;do
       case $REPLY in 
       1)
	       echo "install"
	       ;;
       2)
	       echo "update"
	       ;;
       3)
	       echo "config"
	       ;;
       4)
	       echo "remove"
	       ;;
       *)
	       echo "No this select"
	       ;;
        esac
done

函數:function

函數定義格式:

函數名 ()
{
 	函數體
}
或
function 函數
{
	函數體
}
#寫了function關鍵詞,可以省略函數名後面的括弧

調用函數:直接通過函數名調用

函數名出現的地方,會被自動替換為函數代碼

[root@centos8 ~]#dir() {
> ls -l
> }
[root@centos8 ~]#dir  #調用函數
total 4

函數文件:只存放函數的文件

調用函數文件
 . filename 或 source  filename #.和source等價

函數返回值

# 使用echo等命令進行輸出

# 函數體中調用命令的輸出結果

函數的參數

也是用$n等來實現的。

函數退出狀態碼

#1. 取決於最後一天命令的狀態碼

#2. 自定義狀態碼: retuen num #0:無錯誤返回,1-255:有錯誤返回

函數的變數

普通變數:變數名="值" #只能當前進程使用

環境變數:export 變數名="值" #當前進程和子進程都能使用

本地變數: local 變數名="值" #限定了變數在函數中有效,對外部的不影響

範例:

#判斷操作系統類型安裝軟體
#!/bin/bash
os_type
{
if   cat /etc/os-release | grep -i -q "ubuntu" ; then  # -q:不顯示查找的結果,不管找到與否
	echo "ubuntu"
elif  cat /etc/os-release | grep -E "centos" ;then
	echo "centos"
else 
	echo "no find ubuntu or centos"
fi
}
if [ `os_type` = centos ] ;then #字元串用= != < > 等 (判斷符號兩邊需要加上空格)
	yum install httpd -y
elif [ `os_type` = ubuntu ] ; then
	apt install httpd -y
else
	echo "nofind centos or ubuntu"
#粗略判斷ip格式是否合法
##/bin/bash
is_ip () 
{ 
   if	[[ "$1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$  ]] ;then
	  echo "$1 is valid"
   else
	  echo "$1 is not valid" 
  fi
}
is_ip $1  #給函數傳遞參數

shell腳本的常用工具

shell腳本信號的捕捉:trap

trap:陷阱,用於捕獲信號的

信號的類型:

使用trap -l可以查看

CTRL+C:發送的就是2(SIGINT)信號,程式收到這個信號以後就會退出。

shell腳本捕獲信號

通過trap指令來完成:

#格式:
#通過捕獲信號來修改信號的原有功能
trap '捕獲到信號以後要做的事'  信號 #信號可以是全稱、縮寫或者前面的數字標號

例如:
trap '' 信號 #忽略信號操作
trap '-' 信號 #恢覆信號原有的功能

shell腳本創建臨時文件:mktemp

希望創建的臨時文件和現有文件不衝突

#創建臨時文件的格式
mktemp [選項] [模板]  #模板就是臨時文件的文件名
#模板格式: filenameXXX,文件首碼+三個隨機字元(X(大寫)至少要出現三個)

例如;mktemp fileXXX --->file90X
#選項: 

-d:創建臨時目錄文件
-p:指定創建的位置

範例

#通過創建臨時文件,實現文件垃圾箱(把不用的文件移動到一個目錄裡面)
DIR=`mktemp -d /tmp/trash-$(date +%F_%H-%M-%S)XXXXXX` #創建一個臨時目錄文件
mv $* $DIR # $*:表示所有位置的參數
echo $* is move to $DIR

安裝複製文件 install

install命令可以改許可權、拷貝、創建文件夾等

#編譯安裝make install:把make命令執行的編譯的結果複製到對應的文件中。make install 調用了install命令
#install 的用法(和cp命令很類似)

#選項
-m MODE,預設755,修改許可權
-o OWNER,指定所有者
-g GROUP,指定所有組
-d DIRNAME 目錄,創建目錄文件

##例如
install -m 770 -d /testdir/installdir #創建一個許可權為770的文件夾(install -d 相當於 mkdir -p)

install -m 700 -o tom -g root /etc/issue /etc/xx.txt #複製一個文件到指定位置,複製的時候更改了許可權

expect

把互動式的命令變成非互動式的。(espect通過對指定命令的監控,出現對應關鍵字的時候執行對應操作)

#expect中相關命令:
spawn 監控某一個命令的執行
expect 捕獲特定的字元串
send  捕獲到這個特定字元串後,發送對應信息
interact 允許用戶交互
exp_continue 匹配多個字元串在執行動作後加此命令

範例

#匹配到hi後,會輸出“you said hi”,並換行
 expect "hi" {send "You said hi\n"} #捕獲屏幕上是否有hi,如果有就自動列印xx

shell腳本的數組

數組:多個變數的集合

bash的數組支持稀疏格式 #索引不連續就叫做稀疏格式

數據的申明

建議先聲明再使用。
#聲明數組:
declare -a 數據名 #申明為普通數組
declare -A 數組名 #申明為關聯數組 #管理數組必須申明後再使用,且關聯和普通不能轉換

#聲明變數
既然所有變數的預設類型是字元串型,那麼只要我們把變數聲明為整數型就可以進行運算了,
# 定義變數b並賦值為3,具有整型屬性。 declare -i x=3

數組賦值

#單個元素賦值 數組名[索引]=值
#例如:weekdays[0]="Sunday"

#一次全部賦值:數組名=(v1,v2...vn)
#範例:title=("ceo" "coo" "cto")  #使用空格作為分隔符,而不是逗號

使用數組

${數組名[索引]}

#引用數組所有元素
${ARRAY_NAME[*]}或${ARRAY_NAME[@]}

刪除數組

#刪除數組中的某一個元素
unset 數組名[索引]

#刪除整個數組
unset 數組名

關聯數組

下標不是預設的數字0..n,而是自定義的。

格式
數組名[自定義的下標]=值
#例如: aa[name1]=bob  --- echo ${aa[name1]}--->bob

範例

#隨機生成十個數字,找出最大的和最小的
#!/bin/bash
max=0
min=0
declare -a arr #定義一個數組用於存儲生成的是個隨機數
i=0
while [ $i -le 10 ];do
	arr[$i]=$RANDOM #給數組賦值
	if [ $i -eq 0 ];then #把第一個數作為基準來判斷後續數的大小
		max=${arr[$i]}
		min=${arr[$i]}
        else
		if [ ${arr[$i]} -gt $max ];then 
			max=${arr[$i]}
		fi
		if [ ${arr[$i]} -lt $min ];then 
			min=${arr[$i]}
		fi
	fi
  let i++ #let工具需要一個變數來接受變數的值
done
echo "max is : $max , min is $min"

shell的字元串處理

shell字元串切片

取出某個字元串中的部分內容。

#數組中顯示數組元素的個數:
${#數組名}
#獲取字元串的長度
${#var}
例如:str=jkfjafasfa --->10

#跳過字元串左邊的幾個
${var:num} #num:表示需要跳過幾個
#跳過字元串左邊的幾個,保留多少個
${var:offset:number} #number表示要保留的長度

根據模式取字元串

#刪左留右邊
${var#*word} #從左邊開始找,一直找到word後,就把他們都刪除掉(懶惰模式)
${var##*word} #從左邊開始找,一直找到最右邊的word後,就把他們都刪除掉(貪婪模式)
#範例:
file="var/log/messages" ---echo ${file#*/}-->log/messages

字元串的查找和替換

#替換第一次匹配到的
${var/pattern/substr}

#替換所有匹配到的
${var//pattern/substr}

刪除指定的字元串

#刪除掉第一次找到的
${var/pattern}

#刪除所有找的的
${var/pattern}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、String類及常用方法 String :字元串,使用一對""引起來表示。 1.理解String的不可變性 (1)String實現了Serializable介面:表示字元串是支持序列化的 (2)實現了Comparable介面:可以比較大小 (3)String內部定義了final char[] v ...
  • 面向對象 在學習面向對象之前我們先來看一下麵向過程 面向過程思想 面向過程的步驟清晰簡單,第一步做什麼,第二步做什麼 面向對象過程適合處理一些簡單的問題 面向對象的過程可以用把大象放進冰箱舉例 ​ 面向對象的分析: ​ 第一步:把冰箱門打開 ​ 第二步:把大象放進冰箱 ​ 第三步:把冰箱門關上 面向 ...
  • 1、SpringCloud技術棧 開發分散式系統可能具有挑戰性,複雜性已從應用程式層轉移到網路層,並要求服務之間進行更多的交互。將代碼設為“cloud-native”就需要解決12-factor,例如外部配置,服務無狀態,日誌記錄以及連接到備份服務之類的問題,Spring Cloud項目套件包含使您 ...
  • 問題 當我使用kubeadm部署成功k8s集群時在想預設生成的證書有效期是多久,如下所示 /etc/kubernetes/pki/apiserver.crt #1年有效期 /etc/kubernetes/pki/front-proxy-ca.crt #10年有效期 /etc/kubernetes/p ...
  • 首先我們來瞭解一下什麼是CRM客戶管理系統? CRM系統包括一些核心的客戶關係管理業務功能,如:潛在客戶、客戶管理、拜訪管理、商機管理、訂單管理等模塊,滿足企業客戶關係信息化的要求,並幫助企業提高客戶資源的管理效率,能夠通過項目視圖清晰的瞭解每個項目的進展情況,通過豐富的統計報表掌握全局的項目數據。 ...
  • Java面向對象(四) 十一、package 關鍵字(拓展) 11.1 package 關鍵字的使用: 為了更好的實現項目中類的管理,提供包的概念 使用 package 聲明類或介面所屬的包,聲明在源文件的首行 包,屬於標識符,遵循標識符的命名規則、規範(xxxyyyzzz)、“見名知意” 一般包通 ...
  • 市場上輕量級ORM有很多,比如Dapper、Chloe 本篇文章就介紹一下 功能比較多並且全的ORM 1、Entity Framework(重量級) 2、SqlSugar(重量級) 3、NHibernate(重量級) 4、PetaPoco (介於EF和Dapper之間) 對比:操作的難易程度、執行效 ...
  • 第三回 萬文疑謀生思緒 璃月港口見清玉 雲溪愣了下,在他的認知中,神之眼正常而言不會有黑色的存在,就像在實數的體系內不會有i一樣,他搖了搖頭。而紀存初的眼中有閃過一次迷茫和失望,很快恢復過來,笑道:“算了,反正也只是個坊間傳說而已,對了,小子,有興趣入我萬文集舍麽?” 話題跳轉的如此之快,讓雲溪有點 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...