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