在數字化時代的浪潮中,Linux操作系統憑借其高效、穩定、開源的特性,成為了無數開發者和系統管理員的首選。
而在Linux的龐大生態系統中,Shell編程無疑是連接用戶與系統內核的橋梁,它讓我們能夠通過簡單的命令和腳本,實現對系統的靈活控制和自動化管理。
shell腳本前言
shell腳本入門
shell變量基礎
shell變量子串
shell數值運算
條件表達式
流程控制語句
shell函數
case語句
shell變量數組
shell腳本前言
|為什么學習shell編程
Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具,Linux/UNIX系統的底層及基礎應用軟件的核心大部分涉及Shell腳本的內容
每一個合格的Linux系統管理員或運維工程師,都需要熟練的編寫Shell腳本語言,并能夠閱讀系統及各類軟件附帶的Shell腳本內容
只有這樣才能提升運維人員的工作效率,適應日益復雜的工作環境,減少不必要的重復工作,從而為個人的職場發展奠定較好的基礎
| 學好Shell編程所需的基礎知識
能夠熟練使用vim編輯器,熟悉SSH終端
有一定的Linux命令基礎,至少需要掌握80個以上Linux常用命令,并能夠熟練使用它。
要熟練掌握Linux正則表達式及三劍客命令(grep,sed,awk)
| 如何學好Shel編程
學好Shel編程的核心:多練-->多思考-->再練-->再思考,堅持如此循環即可!
新手大忌:不可拿來主義,可以模仿,但是要自己嚼爛了吃下去。
格言:你覺得會了并不一定會了,你認為對的并不一定對的。
大家要勤動手,自行完成學習筆記和代碼的書寫。
shell腳本入門
|shell是什么?
Shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,并處理各種各樣的操作系統的輸出結果,輸出屏幕返回給用戶
這種對話方式可以是:
交互的方式:從鍵盤輸入命令,通過/bin/bash的解釋器,可以立即得到shell的回應
非交互的方式:腳本
|Shell能做什么?
安裝操作系統:CentOS6.X和CentOS7.X 手動方式安裝或克隆方式自動化安裝:cobbler、kickstart 底層都是shell腳本實現
優化 SSH:關閉Selinux 優化防火墻,放行 80、443、SSH端口、zabbix監控等服務訪問端口 個人需求:加大文件描述符、時間同步、硬件時間、軟件時間、YUM源等,都可以寫入shell腳本
安裝服務 Nginx、Apache Tomcat、PHP、MySQL、Redis、Mongo、docker等例如:PHP5.4和PHP7.1寫入shell腳本,實現自動化安裝不同版本的服務
代碼上線:shell腳本自動化發布自動化回滾
zabbix監控:硬件、軟件、進程、端口號、自定義監控都可以通過shell腳本+定時任務完成
日志分析日志統計:命令三劍客+定時任務+shell腳本來實現在ELK集群上的日志展示
業務層面
輔助開發程序:nohup和python的大量的日志處理
| 如何Shell編程
重點掌握前面的內容:變量、判斷、bash,對它們徹底理解
先看懂,讀懂shell腳本
講完判斷,將前面學過的腳本進行完善
自己寫簡單的腳本,如一些小的項目:生活中:隨機點餐、大保健、會員辦理,消費、服務 對應價格不同 結賬 會員賬號 密碼 密碼丟失
有基本適合自己的教材,如:跟老男孩學習Shell編程或者完善的文檔
不能拿來及用,要搞懂、變成自己的,吸收了后可以解決企業中大部分的shell問題
一個shell腳本
# cat test.sh
#!/bin/bash
echo "Hello World!"
| 執行腳本的三種常用的方式
(1)使用bash或者sh通過解釋器執行腳本 在子shell中執行命令
# sh test.sh
Hello World!
# bash test.sh
Hello World!
(2)使用路徑方式
全路徑執行方式或者當前路徑,必須給x權限
# chmod +x test.sh
# /server/scripts/test.sh
Hello World!
# ./test.sh
Hello World!
(3)使用source或者 . 的方式
# . test.sh
Hello World!
# source test.sh
Hello World!
(4)其他shell的執行方式
# cat test.sh | bash
Hello World!
# echo ls | bash
test.sh
# bash < test.sh
Hello World!
shell變量基礎
| 什么是變量
shell變量是一種很“弱”的變量,默認情況下,一個變量保存一個串,shell不關心這個串是什么含義,所以若要進行數學運算,必須使用一些命令例如let、declare、expr、雙括號等。
shell變量可分為兩類:局部變量和環境變量
局部變量只在創建它們的shell中可用
環境變量則可以在創建它們的shell及其派生出來的任意子進程中使用
有些變量是用戶創建的,其他的則是專用shell變量
變量名必須以字母或下劃線字符開頭,其余的字符可以是字母、數字(0~9)或下劃線字符
變量名字是大小寫敏感的,環境變量推薦設置為字母大寫
給變量賦值時,等號周圍不能有任何空白符,為了給變量賦空值,可以在等號后跟一個換行符
變量刪除:用set命令可以查看所有的變量,unset var命令可以清除變量var,var相當于沒有定義過
變量只讀:readonly var可以把var變為只讀變量,定義之后不能對var進行任何更改
對shell變量的引用方式很多,用這些方式可以方便的獲取shell變量的值,變量值的長度,變量的一個字串,變量被部分替換后的值等等。
| 變量值的定義
字符串定義
# name=Iamlizhenya
# name='I am lizhenya'
# name="I am lizhenya"
# echo $name
I am lizhenya
雙引號和單引號的區別:雙引號解析變量,單引號所見即所得不能解析變量,不加引號可以解析變量
數字的定義
# age="12 23 432"
# echo $age
12 23 432
命令的定義
通過``調用命令
# date +%F-%H-%M-%S
2022-07-07-18-02-34
# time=`date +%F-%H-%M-%S`
# echo $time
2022-07-07-18-02-40
# 時間是固定 每次調用都相同
# echo $time
2022-07-07-18-02-40
通過$()調用命令
# time=$(date +%F-%H-%M-%S)
# echo $time
2022-07-07-18-02-52
| 變量可以定義變量
# ip=`ifconfig eth0|awk 'NR==2{print $2}'`
# echo $ip
10.0.0.7
# dir=${ip}_${time}
# echo $dir
10.0.0.7_2022-07-07-18-11-34
當shell腳本中出現2條以上相同的命令就將它們寫成變量
| 核心位置變量
echo hehe...........
shell函數
函數是命令的集合 完成特定功能的代碼塊
函數代碼塊 方便復用
函數類似變量 只有先定義才能執行
區別:變量不調用也會執行 name=oldboy 函數只有調用才會執行代碼
| 函數的定義
#!/bin/sh
fun1(){
echo "函數的第一種定義方式"
}
fun1
function fun2 {
echo "函數的第二種定義方式"
}
fun2
function fun3(){
echo "函數的第三種定義方式"
}
fun3
案例: 菜單
#!/bin/sh
fun1(){
echo -e " 1.包子"
echo -e " 2.麻辣燙"
echo -e " 3.小米粥"
echo -e " 4.漢堡"
echo -e " 5.燒烤"
}
fun1
| 函數復用
# cat 1.sh
#!/bin/bash
. /server/scripts/day4/test.sh
fun3
# sh 1.sh
函數的第三種定義方式
# cat test.sh
#!/bin/sh
fun1(){
echo "函數的第一種定義方式"
}
function fun2 {
echo "函數的第二種定義方式"
}
function fun3(){
echo "函數的第三種定義方式"
}
案例: 函數的傳參
函數調用在函數名稱的后面
fun1 參數1 參數2 參數3 對應函數中的 $1 $2 $3
函數判斷文件是否存在
# cat fun.sh
#!/bin/sh
fun1(){
if [ -f $1 ];then
echo "$1 文件存在"
else
echo "$1 文件不存在"
fi
}
fun1 /etc/hosts
# sh fun.sh
/etc/hosts 文件存在
# cat fun.sh
#!/bin/sh
fun1(){
if [ -f $3 ];then
echo "$3 文件存在"
else
echo "$3 文件不存在"
fi
}
fun1 /etc/hosts /etc/passwd /etc/fsttttttt
# sh fun.sh
/etc/fsttttttt 文件不存在
# cat fun.sh
#!/bin/sh
fun1(){
if [ -f $1 ];then
echo "$1 文件存在"
else
echo "$1 文件不存在"
fi
}
fun1 $2
# sh fun.sh /etc/passwd /etc/hosts
/etc/hosts 文件存在
函數可以識別變量
#!/bin/sh
file=$1
fun1(){
if [ -f $file ];then
echo "$file 文件存在"
else
echo "$file 文件不存在"
fi
}
fun1
# sh fun.sh /etc/hosts
/etc/hosts 文件存在
| 函數變量
可以識別全局變量 函數外的都是當前shell的全局變量
只在函數內生效的變量定義
# cat fun.sh
#!/bin/sh
fun1(){
local num=20
for i in `seq $num`
do
total=$[$count+$i]
done
echo "當前運算的結果是: $total"
}
fun1
echo $num
# sh fun.sh
當前運算的結果是: 20
函數的返回值return
# cat fun.sh
#!/bin/sh
fun1(){
echo 100
return 50
}
result=`fun1`
echo "當前函數的返回值是: " $?
echo "當前函數的執行結果: " $result
# sh fun.sh
當前函數的返回值是: 50
當前函數的執行結果: 100
利用返回值來判斷
錯誤寫法
錯誤寫法一:
#!/bin/sh
fun1(){
if [ -f $1 ];then
return 50
else
return 100
fi
}
fun1 $1
[ $? -eq 50 ] && echo "文件存在"
[ $? -eq 100 ] && echo "文件不存在"
錯誤寫法二:
#!/bin/sh
fun1(){
if [ -f $1 ];then
return 50
else
return 100
fi
}
fun1 $1
if [ $? -eq 50 ];then
echo 文件存在
elif [ $? -eq 100 ];then
echo 文件不存在
fi
解決方法:
[ $? -eq 50 ] && echo 文件存在 || echo 文件不存在
if [ $? -eq 50 ];then
echo 文件存在
else
echo 文件不存在
fi
賦值的方式
re=$?
if [ $re -eq 50 ];then
echo 文件存在
elif [ $re -eq 100 ];then
echo 文件不存在
fi
-
Linux
+關注
關注
87文章
11415瀏覽量
212264 -
Shell
+關注
關注
1文章
371瀏覽量
23805 -
腳本
+關注
關注
1文章
395瀏覽量
28288
原文標題:Linux從零到精通:最簡單的Shell腳本入門教程(附PDF)
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Linux從入門到精通需要掌握什么?
從入門到精通Linux需學習的技能
linux shell 腳本入門
如何創建和執行一個簡單的Linux shell腳本
Linux Shell腳本經典案例分享

評論