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