今天繼續學習Linux系統中shell腳本

首先繼續上次的內容看一下另一個案例

案例:持續檢查服務器負載

uptime查看負載情況(也可以用top命令)

[root@localhost ~]# uptime22:11:26 up  7:05,  3 users,  load average: 0.00, 0.00, 0.00
#!/bin/bash
#Function:持續檢查服務器負載,如果負載過高則發送警告郵件
while true
doload=$(uptime | awk '{print $10}' | tr -s "," ' ')if [ $(echo "$load > 1.0" | bc) -eq 1 ];thenecho "Warning:Server load is high:$load" | mail -s "Server load warning" admin@example.comfisleep 300
done

(該代碼可能執行不成功)

案例:持續監控應用日志

[root@localhost ~]# grep -i "error" /var/log/messages 
Aug 26 19:30:52 localhost /usr/sbin/irqbalance[1044]: Cannot change IRQ 73 affinity: Input/output error
Aug 26 19:30:52 localhost /usr/sbin/irqbalance[1044]: Cannot change IRQ 63 affinity: Input/output error

案例:逐行讀取文件

[root@localhost ~]# vim test.sh 
#!/bin/bash
while read line
dousername=$(echo $line | cut -d':' -f1)time=$(echo $line | cut -d':' -f3)time=$(date -d @$[time*24*3600])echo ${username}-$time
done < /root/shadow
[root@localhost ~]# ./test.sh 
root-2025年 09月 08日 星期一 08:00:00 CST
bin-2024年 12月 24日 星期二 08:00:00 CST
daemon-2024年 12月 24日 星期二 08:00:00 CST
adm-2024年 12月 24日 星期二 08:00:00 CST
lp-2024年 12月 24日 星期二 08:00:00 CST
sync-2024年 12月 24日 星期二 08:00:00 CST
shutdown-2024年 12月 24日 星期二 08:00:00 CST
halt-2024年 12月 24日 星期二 08:00:00 CST
mail-2024年 12月 24日 星期二 08:00:00 CST
operator-2024年 12月 24日 星期二 08:00:00 CST
games-2024年 12月 24日 星期二 08:00:00 CST
ftp-2024年 12月 24日 星期二 08:00:00 CST
nobody-2024年 12月 24日 星期二 08:00:00 CST
systemd-coredump-2025年 08月 26日 星期二 08:00:00 CST
dbus-2025年 08月 26日 星期二 08:00:00 CST
polkitd-2025年 08月 26日 星期二 08:00:00 CST
saslauth-2025年 08月 26日 星期二 08:00:00 CST
dhcpd-2025年 08月 26日 星期二 08:00:00 CST
sshd-2025年 08月 26日 星期二 08:00:00 CST
rpc-2025年 08月 26日 星期二 08:00:00 CST
tss-2025年 08月 26日 星期二 08:00:00 CST
apache-2025年 08月 26日 星期二 08:00:00 CST
unbound-2025年 08月 26日 星期二 08:00:00 CST
libstoragemgmt-2025年 08月 26日 星期二 08:00:00 CST
cockpit-ws-2025年 08月 26日 星期二 08:00:00 CST
cockpit-wsinstance-2025年 08月 26日 星期二 08:00:00 CST
pesign-2025年 08月 26日 星期二 08:00:00 CST
chrony-2025年 08月 26日 星期二 08:00:00 CST
tcpdump-2025年 08月 26日 星期二 08:00:00 CST
tom-2025年 09月 08日 星期一 08:00:00 CST
lynn-2025年 09月 08日 星期一 08:00:00 CST
user1-2025年 09月 08日 星期一 08:00:00 CST

循環控制語句continue

continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

用法示例:

[root@localhost ~]# vim continue.sh
#!/bin/bash
i=1
while [ $i -le 10 ]
doecho $ilet i++
done
[root@localhost ~]# chmod +x continue.sh 
[root@localhost ~]# ./continue.sh 
1
2
3
4
5
6
7
8
9
10

循環控制語句break

break [N]:提前結束第N層后的全部循環;最內層為第1層,默認為1

[root@localhost ~]# vim break.sh
for((i=0;i<10;i++));do[ $i -eq 5 ] && breakfor((j=0;j<10;j++));do[ $j -eq 5 ] && breakecho $jdoneecho ----------------------------
done
[root@localhost ~]# chmod +x break.sh 
[root@localhost ~]# ./break.sh 
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------

shift技術


shift命令用于對參數的向左移動,通常用于在不知道傳入參數個數的情況下依次遍歷每個參數,然后進行相應的處理(常見與Linux中各種程序的啟動腳本)。在掃描處理腳本程序的參數時,經常要用到shift命令

shift命令每執行一次,參數序列順次左移一個位置,$#的值減1,用于分別處理每個參數,移出去的參數不可再用

注意:$#表示腳本后跟隨的參數總的個數,$n可以獲取腳本后跟隨的第n個參數的值

示例:

[root@localhost ~]# vim shift.sh 
#!/bin/bashwhile [ $# -ne 0 ]
doecho "一共$#個參數,內容分別是:"for i in `seq $#`;doecho -n -e "$i\t"doneechoshift
done
[root@localhost ~]# ./shift.sh 1 2
一共2個參數,內容分別是:
1       2
一共1個參數,內容分別是:
1

案例:累加1-100

[root@localhost ~]# vim sum.sh 
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
dolet sum+=$i
done
echo $sum
[root@localhost ~]# ./sum.sh 
5050

Shell中的數組


1.(1)Shell數組的定義

數組的基本定義

Shell中,用小括號()來表示數組,數組元素之間用空格來分隔

[root@localhost ~]# array1=(1 2 3 4 5 6)
[root@localhost ~]# echo ${array1[*]}    #輸出數組的所有元素
1 2 3 4 5 6
[root@localhost ~]# echo ${array1[@]}    #輸出數組的所有元素
1 2 3 4 5 6
[root@localhost ~]# echo ${array1[0]}    #輸出數組的第N個數(由0代表第一個數開始)
1
[root@localhost ~]# echo ${array1[2]}    #輸出數組的第3個數
3
(2)采用鍵值對的形式賦值

Shell中用小括號將變量括起來,同時采用鍵值對的形式賦值

[root@localhost ~]# array2=([1]=one [2]=two [3]=three)
[root@localhost ~]# echo ${array2[*]}      #輸出數組的所有元素 
one two three
[root@localhost ~]# echo ${array2[@]}      #輸出數組的所有元素 
one two three
[root@localhost ~]# echo ${#array2[@]}     #輸出數組的元素個數 
3
(3)動態定義數組數量

動態地定義數組變量,并使用命令的輸出結果作為數組的內容

[root@localhost ~]# array3=($(ls /boot))
[root@localhost ~]# echo ${#array3[*]}   #輸出定義數組的元素個數
13
[root@localhost ~]# echo ${array3[0]}
config-6.6.0-72.0.0.76.oe2403sp1.x86_64

2.Shell數組的打印

  • 打印單個數組元素: ${數組名[下標]} 。當未指定數組下標時,下標默認從0開始

  • 打印全部數組內容:${數組名[@]}或 ${數組名[*]}

  • 打印數組元素的個數:${#數組名[@]}或 ${#數組名[*]}

3.Shell數組的賦值

如果下標不存在,則自動添加一個新的元素;如果下標存在,則覆蓋原來的值

4.Shell數組的拼接合并

所謂Shell數組拼接(數組合并),就是將兩個數組連接成一個數組

拼接數組的思路是:先利用@或者*,將數組擴展成列表,然后再合并到一起,具體格式如下:

[root@localhost ~]# array1=(1 2 3 4 5 6)
[root@localhost ~]# array2=(7 8 9 10 11 12)
[root@localhost ~]# array3=(${array1[@]} ${array2[@]})
[root@localhost ~]# echo ${array3[*]}
1 2 3 4 5 6 7 8 9 10 11 12

5.Shell刪除數組元素

Shell中,使用unset關鍵字來刪除數組元素,具體格式如下:

[root@localhost ~]# unset array3[2]
[root@localhost ~]# echo ${array3[*]}
1 2 4 5 6 7 8 9 10 11 12
[root@localhost ~]# unset array3
[root@localhost ~]# echo ${array3[*]}[root@localhost ~]# 

6.獲取數組某范圍的元素

Shell中直接通過${數組名[@/*]:起始位置:長度}獲取數組給定范圍內元素,返回字符串,中間用空格分開

[root@localhost ~]# arr1=(1 2 3 4 5)
[root@localhost ~]# echo ${arr1[*]:1:2}
2 3
[root@localhost ~]# echo ${arr1[@]:0:4}
1 2 3 4

mapfile命令


mapfile直接用一個指令交互式的生成一個數組

[root@localhost ~]# ls /boot/ > boot.txt
[root@localhost ~]# mapfile arr6 < boot.txt
[root@localhost ~]# echo ${arr6[*]}
config-6.6.0-72.0.0.76.oe2403sp1.x86_64 dracut efi grub2 initramfs-0-rescue-5a44ea1f344449c0863349ae24820f72.img initramfs-6.6.0-72.0.0.76.oe2403sp1.x86_64.img initramfs-6.6.0-72.0.0.76.oe2403sp1.x86_64kdump.img loader lost+found symvers-6.6.0-72.0.0.76.oe2403sp1.x86_64.gz System.map-6.6.0-72.0.0.76.oe2403sp1.x86_64 vmlinuz-0-rescue-5a44ea1f344449c0863349ae24820f72 vmlinuz-6.6.0-72.0.0.76.oe2403sp1.x86_64

shell中的函數


shell函數的定義

注意:在shell里不支持函數的參數傳入,只支持腳本的參數傳入,所以name()內不能寫任何東西。

本質的作用就是;將一段重復的代碼編入腳本中,放在指定位置,使用時直接調用。

示例

[root@localhost ~]# vim sum.sh
#!/bin/bash
c1=$1
c2=$2
c3=$3
sum() {
sum1=0
for i in $(seq $c1 $c2 $c3)
dolet sum1+=$i
done
echo $sum1
}
sum
[root@localhost ~]# chmod +x sum.sh 
[root@localhost ~]# ./sum.sh 1 100
5050

案例;在子shell里調用的函數在父shell里不能輸出

[root@localhost ~]# vim sum.sh
#!/bin/bash
c1=$1
c2=$2
c3=$3
sum() {
sum1=0
for i in $(seq $c1 $c2 $c3)
dolet sum1+=$i
done
return $sum1
}
sum
[root@localhost ~]# ./sum.sh 1 100
[root@localhost ~]# echo $sum1[root@localhost ~]# source sum.sh 1 100
[root@localhost ~]# echo $sum1
5050

return的效果:把結果存儲在一個位置上

Shell函數的調用

調用 Shell 函數時可以給它傳遞參數,也可以不傳遞。如果不傳遞參數,直接給出函數名字即可

Shell的八大擴展功能(不重要)


花括號

在shell腳本中,可以使用括號對字符串進行擴展,我們可以在一對花括號中包含一組以分號分隔的字符串或者字符串序列組成一個字符串擴展,注意最終輸出結果以空格分隔,使用該擴展花括號不可以被引號引用,花括號的數量必須是偶數個

[root@localhost ~]# echo {1,5} #對字符串進行擴展
1 5
[root@localhost ~]# echo {hello,world} #對字符串進行擴展
hello world
[root@localhost ~]# echo {a..z} #對字符串序列進行擴展
a b c d e f g h i j k l m n o p q r s t u v w x y z
#字符串后面可以跟一個步長整數,默認為1或-1
[root@localhost ~]# echo {a..z..2}
a c e g i k m o q s u w y
[root@localhost ~]# echo {a..z..3}
a d g j m p s v y
[root@localhost ~]# echo {1..9..3}
1 4 7
[root@localhost ~]# echo {1..9..2}
1 3 5 7 9
[root@localhost ~]# echo "{a..z}" #花括號擴展不能使用引號
{a..z}
[root@localhost ~]# echo t{i,o}p #花括號前后都可以添加可選字符串
tip top
[root@localhost ~]# echo t{o,e{a,m}}p #花括號支持嵌套
top teap temp
#花括號批量操作
[root@localhost ~]# mkdir -p t{o,e{a,m}}p
[root@localhost ~]# touch t{o,e{a,m}}p/{a,b,c,d}e.txt

波浪號

波浪號在Shell腳本中默認代表當前用戶家目錄

[root@localhost /]# echo ~ #顯示當前用戶的家目錄
/root
[root@localhost /]# echo ~/elk
/root/elk
[root@localhost /]# echo ~elk #顯示特定用戶的家目錄,該用戶必須存在
/home/elk
[root@localhost /]# echo ~+ #顯示當前工作目錄
/
[root@localhost /]# echo ~- #顯示前一個工作目錄
/root
變量替換

在Shell腳本中我們會使用 對變量進行擴展替換,變量字符可以放到花括號中,這樣可以防止需要擴展的變量字符與其他不需要擴展的字符混淆,如果 對變量進行擴展替換,變量字符可以放到花括號中,這樣可以防止需要擴展的變量字符與其他不需要擴展的字符混淆,如果 對變量進行擴展替換,變量字符可以放到花括號中,這樣可以防止需要擴展的變量字符與其他不需要擴展的字符混淆,如果后面是位置變量且多余一個數字,必須使用{}

[root@localhost ~]# a="hello word"
[root@localhost ~]# echo $a
hello word
[root@localhost ~]# echo ${a}
hello word
[root@localhost ~]# b=a
[root@localhost ~]# echo ${b} #直接返回變量的值
a
[root@localhost ~]# echo ${!b} #間接引用a變量的值
hello word
[root@localhost ~]# c=b
[root@localhost ~]# echo ${!c} #盡可以實現一層簡介引用
a

變量替換操作還可以測試變量是否存在及是否為空,若變量不存在或為空,則可以為變量設置一個默認值

Shell腳本支持多種形式的變量測試與替換功能,如下表所示

語法格式功能描述
${變量:-關鍵字}如果變量未定義或為空,則返回關鍵字,否則返回變量值
${變量:=關鍵字}如果變量未定義或為空,則將關鍵字賦值給變量,并返回結果,否則直接返回變量值
${變量:?關鍵字}如果變量未定義或為空,則通過標準錯誤顯示包含關鍵字的錯誤信息,否則返回變量值
${變量:+關鍵字}如果變量未定義或為空,則直接返回空,否則返回關鍵字

唯一要了解basename和dirname,其余的都不重要。

basenamedirname:

basename:可以獲取一個路徑中的文件名

dirname:僅保留路徑,刪除文件名

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

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

相關文章

Win系統下配置PCL庫第一步之下載Visual Studio和Qt 5.15.2(超詳細)

之前在上篇文章Win系統下配置PCL庫_windows pcl庫 下載-CSDN博客中提到配置PCL庫的教程是下載Visual Studio和Qt 5.15.2&#xff0c;后續在測試中我發現前面這兩步很重要&#xff0c;一般Qt在線下載器選項選不好的話Qt是裝的Qt6&#xff0c;在VTK編譯的時候Qt6往往需要C17編譯&…

openCV3.0 C++ 學習筆記補充(自用 代碼+注釋)---持續更新 四(91-)

環境&#xff1a;OpenCV3.2.0 VS201791、合并Y方向重疊的輪廓以輪廓的最小垂直外接矩形框的y為依據&#xff0c;合并y重疊的輪廓。數學邏輯&#xff1a;幾何合并的數學表達坐標系統&#xff1a;假設矩形由左上角坐標(x, y)和寬高(width, height)定義。合并公式&#xff1a;合并…

numpy數組的升維和降維的方法集錦

為適配計算包對numpy數組的維度要求&#xff0c;對numpy數組進行升維或降維轉化&#xff0c;是非常常見的操作。這里嘗試通過多種方式對numpy數組進行升維或降維。1 數組升維1.1 np.expand_dims在0維升維&#xff0c;示例如下a np.array([1,2,3,4,5]) np.expand_dims(a, axis0…

介紹 Python Elasticsearch Client 的 ES|QL 查詢構建器

作者&#xff1a;來自 Elastic Miguel Grinberg 學習如何使用 ES|QL 查詢構建器&#xff0c;這是一個新的 Python Elasticsearch client 功能&#xff0c;可以更輕松地使用熟悉的 Python 語法構建 ES|QL 查詢。 想要獲得 Elastic 認證嗎&#xff1f;快來了解下一期 Elasticsear…

三坐標測量儀:高精度測量內徑檢測手段及其實際運用

在工業制造領域中&#xff0c;內徑尺寸的精準度直接關系到產品的裝配性能、運行穩定性乃至使用壽命。傳統檢測方法如卡尺、內徑千分尺等難以滿足高精度、復雜結構件的需求。三坐標測量儀技術的出現&#xff0c;打破了這一困境&#xff0c;成為當前工業領域實現高精度內徑檢測的…

DIPMARK:一種隱蔽、高效且具備魯棒性的大語言模型水印技術

摘要水印技術為通過在數據中嵌入隱蔽信息來保障數據安全提供了一種很有前景的方法。該領域的一個首要挑戰在于&#xff0c;在水印嵌入過程中保持原始數據的分布。我們的研究拓展并優化了現有的水印框架&#xff0c;著重強調了保持分布&#xff08;DiP&#xff09;水印的重要性。…

IMU傳感器價格與高精度慣性導航系統供應商分析

本段將對IMU傳感器價格及高精度慣性導航系統的市場情況進行概覽。IMU傳感器作為慣性導航的重要組成部分&#xff0c;其價格水平受到技術、需求和供應商競爭等多重因素的影響。隨著無人機、自動駕駛車輛等新興應用場景的興起&#xff0c;IMU傳感器的市場需求逐漸攀升。這不僅帶動…

3-9〔OSCP ? 研記〕? WEB應用攻擊?利用REST API提權

鄭重聲明&#xff1a; 本文所有安全知識與技術&#xff0c;僅用于探討、研究及學習&#xff0c;嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任&#xff0c;本人不承擔任何責任。 如需轉載&#xff0c;請注明出處且不得用于商業盈利。 …

UE5 基礎應用 —— 07 - 角色藍圖 簡單使用

目錄 一、角色藍圖 1.1 Pawn / Character 1.2 角色基類 1.3 角色基類設置 1.3.1 基礎設置 1.3.2 角色移動和相機旋轉 1.3.3 角色移動 —— 鎖定視角 1.3.4 角色跳躍 1.4 角色派生類設置 1.4.1 添加動畫藍圖 一、角色藍圖 1.1 Pawn / Character Pawn / Character 有什…

流暢的Python(二) 豐富的序列

流暢的Python 第二章&#xff1a;豐富的序列 摘要&#xff1a;在日常Python開發中&#xff0c;我們頻繁與各種數據結構打交道&#xff0c;其中序列類型&#xff08;如列表、元組、字符串&#xff09;是基石。然而&#xff0c;你是否曾因對它們理解不深&#xff0c;而在性能優化…

嵌入式 - ARM6

一、按鍵1. 初始化key.c手冊C32 - IOMUXC1. 復用功能配置IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B: 低四位&#xff08;0101&#xff09; IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);SION(信號監控)1: 0 //0 DISABLED — Input Path is determined by functionality MUX_…

菊水PBZ電源在蓄電池充放電測試中的應用探討

通過高速雙極性電源PBZ系列進行蓄電池恒流&#xff0c;恒壓充電的方法 對于儀器廠商來說&#xff0c;要求“請按照使用說明書使用”是產品的使用方針&#xff0c;或者說是正確用法。但是&#xff0c;作為具有代表性的通用產品&#xff0c;直流電源的實際使用方法可謂五花八門&…

Zephyr嵌入式實時操作系統安裝配置

Zephyr簡介 Zephyr 是一款由 Linux 基金會 托管的開源實時操作系統(RTOS),專為資源受限的嵌入式設備(從微控制器到小型邊緣計算節點)設計,廣泛應用于物聯網(IoT)、工業自動化、消費電子、醫療設備、汽車電子等領域。其核心優勢在于輕量級、高可配置性和對多架構硬件的廣…

Linux系統 SELinux 安全管理與故障排查

一、SELinux 安全上下文管理1. SELinux 簡介SELinux&#xff08;Security-Enhanced Linux&#xff09;是 Linux 內核的強制訪問控制&#xff08;MAC&#xff09;安全子系統&#xff0c;通過基于標簽的訪問控制實現細粒度權限管理&#xff0c;遵循最小權限原則。SELinux 有三種工…

解密完全二叉樹順序存儲之堆結構

前言:各位老鐵好&#xff0c;在前面博客中&#xff0c;筆者分享了有關二叉樹的博客&#xff0c;在那篇博客中&#xff0c;筆者講到了完全二叉樹的存儲結構中有兩種存儲方式&#xff0c;一種是順序存儲&#xff0c;一種是鏈式存儲&#xff0c;鏈式存儲筆者已經帶各位老鐵實現過了…

通過針刺!鵬輝能源移動電源電池革新之作 Secu 系列:不燃電解液加持,充電寶安全新選擇

9月11日&#xff0c;鵬輝能源對外發布新一代移動電源高安全電池Secu系列。該產品通過采用不燃的電解液破解移動電源產品安全難題&#xff0c;直擊當下移動電源安全事故頻發的行業痛點&#xff0c;為移動電源行業帶來更安全、更可靠的半固態電池解決方案。數字化時代&#xff0c…

軟件定義汽車(SDV)與區域電子電氣架構(Zonal EEA)的技術革新

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

在 Docker Compose 中解決文件權限不足的問題

在使用 Docker 和 Docker Compose 構建應用時&#xff0c;由于容器中的文件權限不足而導致某些容器可能無法訪問宿主機上的文件&#xff0c;或者容器內的文件系統無法正確讀取或寫入文件。問題描述在我的項目中&#xff0c;我使用 Docker Compose 來啟動多個服務&#xff0c;并…

認知語義學對人工智能自然語言處理的深層語義分析:理論啟示與實踐路徑

摘要隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;自然語言處理&#xff08;NLP&#xff09;已成為其核心驅動力之一。然而&#xff0c;盡管以大型語言模型&#xff08;LLMs&#xff09;為代表的現代NLP系統在處理語言任務上取得了前所未有的成功&#xf…

React19 中的交互操作

需要安裝的庫 antd-mobile、use-immer在App.jsx 中引入組件 Actionimport "./App.css" import Action from "./pages/action" function App() {return (<><Action></Action></>) }export default Appaction.jsx 組件import LearnI…