SHELL快速入門
學習目標
瞭解運維和自動化運維是什麼及工作實現方式
記住shell是什麼,說出shell的兩分類
知道shell腳本的特點是什麼
運維
運維是什麼?
- 運維是公司的一個技術崗位,負責程序的規劃,管理,安全,優化等方面的工作
運維的工作範圍
以dailyfresh項目爲例:
- 規劃:我們需要多少資源來支持項目的運行
- 管理:項目運行過程中的所有內容都要管理起來
- 流程規範:所有操作都形成制度,提高工作效率
- 平臺:大幅度提高工作效率
- 監控:實時查看項目運行狀態指標
- 告警:狀態指標異常,告知功能工作人員處理
- 安全:網站運營安全措施
- 優化:保證用戶訪問網站的體驗很好
- 考覈:權責分配,保證利益
自動化運維
- 就是將以上工作以代碼化,自動化的方式運行
怎麼進行自動化運維呢?
- 工具,腳本
常見的自動化運維腳本有哪些呢?
- shell腳本和其他語言的開發腳本
- shell腳本就是shell編程的一種具體實現
SHELL簡介
shell是什麼?
- shell是命令解釋器
- shell出於系統和應用之間,負責將應用程序的命令解釋給系統,也負責將系統的命令執行的結果解釋給應用程序,在計算機中,是應用程序與系統之間交流的橋樑。
shell的分類
- shell分爲圖形界面shell和命令行shell
- 圖形界面shell就是桌面
- 命令行shell爲:windows:cmd.exe;linux系統:sh/csh/ksh/bash…
查看當前系統的shell類型:
echo $SHELL
查看當前系統環境支持的shell:
cat /etc/shells
shell腳本
shell腳本使用方式
- 手工方式:直接在終端數據腳本代碼,輸入完一行,enter鍵確認,輸出結果,再輸入下一條指令,依次執行
- 腳本文件定義方式:新建一個文件(.sh),在文件中輸入想要執行的所有代碼,保存後,執行這個文件即可
- 示例:
vim 01_first_shell_script.sh
01_first_shell_script.sh
#/bin/bash
# 這是腳本示例文件
echo "hello"
echo "world"
腳本執行效果:
/bin/bash 01_first_shell_script.sh
hello
woeld
總結
- shell是命令解釋器
- shell分爲圖形界面shell和命令行shell
- shell是可執行命令的組合
SHELL基礎知識
學習目標
- 掌握shell腳本的標準執行方法
- 掌握shell腳本的開發規範和開發小技巧
- 說出shell中常用的三種變量及其特點
- 應用shell的變量實現特定功能
shell腳本
學習目標
- 瞭解shell腳本的內容小技巧
- 掌握shell腳本的標準執行方法
- 掌握shell腳本的開發規範和開發小技巧
創建腳本
- 創建工具:vi/Vim
- 腳本命名:有意義
- 腳本內容:各種可執行的命令
- 註釋內容:
- 單行註釋:# 後面跟的就是單行註釋
- 多行註釋::<
#!/bin/bash
# 這是單行註釋
echo "這是普通的shell腳本命令"
:<<!這是多行
註釋!
:<<a這是第二種多行
註釋的方式a
~
執行腳本文件
/bin/bash 02_zhshi.sh
這是普通的shell腳本命令
腳本執行
shell的執行方式
bash /path/to/script-name 或/bin/bash /path/to/script-name (強烈推薦使用)
/path/to/script-name 或./script-name (當前路徑下執行腳本)
source script-name 或. script-name (注意“.“點號)
腳本開發規範
1、腳本命名要有意義,文件後綴是.sh
2、腳本文件首行是而且必須是腳本解釋器
#!/bin/bash
3、腳本文件解釋器後面要有腳本的基本信息等內容
腳本文件中儘量不用中文註釋;
儘量用英文註釋,防止本機或切換系統環境後中文亂碼的困擾
常見的註釋信息:腳本名稱、腳本功能描述、腳本版本、腳本作者、聯繫方式等
4、腳本文件常見執行方式:bash 腳本名
5、腳本內容執行:從上到下,依次執行
6、代碼書寫優秀習慣;
1)成對內容的一次性寫出來,防止遺漏。
如:()、{}、[]、''、``、""
2)[]中括號兩端要有空格,書寫時即可留出空格[ ],然後再退格書寫內容。
3)流程控制語句一次性書寫完,再添加內容
7、通過縮進讓代碼易讀;(即該有空格的地方就要有空格)
總結
- shell腳本命名:有意義,便於知道腳本的目的
- shell腳本的註釋:單行(#)、多行(:<<字符… 字符)
- shell腳本標準執行方法: /bin/bash /path/to/script-name
- shell腳本開發規範重點:2-4-5
- shell腳本開發小技巧:6-7
變量
學習目標
1、說出變量的定義和目的
2、掌握本地變量的查看格式和使用場景
3、掌握全局變量的查看/定義格式和使用場景
4、掌握普通變量的標準查看方法
5、說出shell內置變量的特性和分類
6、掌握shell內置變量的使用場景
什麼是變量
- 變量包括兩個部分
- 變量名:不變的
- 變量值:變化的
我們一般說的變量,指的是變量名
在shell中,變量分爲三類:
- 本地變量
- 全局變量
- 內置變量
本地變量
本地變量是什麼?
- 本地變量就是在某個環境下才能生成的變量,作用範圍小
- 本地變量包含兩種:
- 普通變量
- 命令變量
普通變量
定義方式
方式一:
變量名=變量值
重點:
變量值必須是一個整體,中間沒有特殊字符
方式二:
變量名='變量值'
重點:
我看到的內容,我就輸出什麼內容
方式三:
變量名="變量值"
重點:
如果變量值範圍內,有可以解析的變量A,那麼首先解析變量A,將A的結果和其他內容組合成一個整體,重
新賦值給變量B
習慣:
**數字不加引號,其他默認加雙引號**
示例:
echo $var
var=666
echo $var
var='666'
echo $var
var="666"
echo $var
var=666 aaa
var='666 aaa'
echo $var
var="666 aaa"
echo $var
var1=bbb
echo $var1
var2='$var $var1'
echo $var2
var2="$var $var1"
echo $var2
命令變量
- 命令變量是指變量的值是一個命令的變量定義方式
定義方式有兩種:
- 變量名=`命令`
- 變量名=$(命令),推薦使用此形式
執行流程:
- 執行命令
- 將命令執行後的結果賦值給變量名
示例:
a=$(echo "this is a test")
echo $a
a=`echo "this is a test"`
echo $a
全局變量
全局變量是什麼?
- 在當前系統環境下都能生效的變量
env 只顯示全局變量
定義全局變量
方法一:
變量=值
export 變量
方法二:(最常用)
export 變量=值
示例:
env
export A=1121
env | grep A=1121
變量查看和取消
查看變量
方式一:
$變量名
場景:
私下裏,在命令行/腳本中使用
圖省事
方式二:
"$變量名"
場景:
私下裏,在命令行/腳本中使用
圖省事
方式三:
${變量名}
場景:
echo " dsa dsafsa dsafsa ${變量名} f "
使用頻率較高
方式四:
"${變量名}"
場景:
標準使用方式
取消變量
unset 變量名
示例:
“`
a=1121
export A=1121
env | grep A=1121
env | grep a=1121
echo “ {a}”
“`
shell內置變量
- 我們之前學習的本地變量,全局變量都是需要通過定義,然後才能實現相應功能的,那麼有沒有一些變量我們可以直
接拿過來使用實現某種具體的功能呢?有,這就是shell內置變量
和腳本文件有關
符號意義
$0 獲取當前執行的shell腳本文件名
$n 獲取當前執行的shell腳本的第n個參數值,n=1..9,當n爲0時表示腳本的文件名,如果n大於9就要用大
括號括起來${10}
$# 獲取當前shell命令行中參數的總個數
$? 獲取執行上一個指令的返回值(0爲成功,非0爲失敗)
示例:
#!/bin/bash
# 獲取當前腳本文件名 $0
echo "當前文件名稱: get_name.sh"
echo "當前文件名稱: $0"
#!/bin/bash
# 獲取第 n 個位置的內容 $n
echo "第 1 個位置的參數內容是: $1"
echo "第 2 個位置的參數內容是: $2"
echo "第 4 個位置的參數內容是: $4"
echo "第 3 個位置的參數內容是: $3"
#!/bin/bash
# 獲取腳本參數總數量 $#
echo "當前腳本傳入的參數總個數是: $#"
字符串精確截取
- 格式:${變量名:起始位置:截取長度}
如:
${file:0:5} 從第1個字符開始,截取5個字符
${file:5:5} 從第6個字符開始,截取5個字符
${file:0-6:3} 從倒數第6個字符開始,截取之後的3個字符
示例:
a="abcdefg"
b=${a:0:6}
echo $b
b=${a:1:6}
echo $b
b=${a:0-3:6}
echo $b
默認值相關
場景1:
變量a如果有內容,那麼就輸出a的變量值
變量a如果沒有內容,那麼就輸出默認的內容格式:${變量名:-默認值}
示例:
- 如果我輸入的參數爲空,那麼輸出內容是”您選擇的套餐是: 套餐1”
如果我輸入的參數爲n,那麼輸出內容是”您選擇的套餐是: 套餐n”
#!/bin/bash
# 測試變量的默認值相關
a=$1
echo "您選擇的套餐是是${a:-1}"
場景二:
- 無論變量a是否有內容,都輸出默認值
- 格式:${變量名+默認值}
示例:
不管我說國家法定結婚年齡是多少歲,都輸出國家法定結婚年齡(男性)是22 歲
#!/bin/bsh
b=$2
echo "法定結婚年齡爲:${b+22}"
總結:
變量: 變量值+變量名
shell三種變量: 本地+全局+內置
本地變量種類:
普通變量定義格式: 變量值'變量值' "變量值"
命令變量定義格式: `命令` $(命令)
命令變量:
專用查看命令:env
標準定義格式:export 變量名=變量值
普通變量查看方法:$變量名"$變量名" ${變量名} "${變量名}"
變量取消專用命令:unset
shell內置變量三種類:
文件相關: $0 $n $# $?
字符串相關: ${變量名:起始位置:截取長度}
默認值相關: ${變量名:-默認值} ${變量名+默認值}
SHELL進階
學習目標:
- 掌握標準測試語句的格式和特點
- 掌握常見條件/計算表達式的格式及使用場景
- 掌握linux常見符號種類和使用場景
- 掌握linux常用命令和使用關鍵點
表達式
學習目標
- 瞭解常用的兩種測試語句
- 掌握標準測試語句的格式和特點
- 說出常用條件表達式種類
- 掌握2種邏輯表達式的特點和使用場景
- 掌握3種文件表達式的特點和使用場景
- 瞭解4種數字表達式和2種字符串表達式的特點和使用場景
- 應用2種計算表達式
測試語句
- Shell環境根據命令執行後的返回狀態值($?)來判斷是否執行成功,當返回值爲0,表示成功,值爲其他時,表示失敗
- 使用專門的測試工具—test命令,可以對特定條件進行測試,並根據返回值來判斷條件是否成立(返回值0爲成立)
- 測試語句形式
- A: test 條件表達式
- B: [ 條件表達式 ],推薦使用
- 格式注意:
以上兩種方法的作用完全一樣,後者爲常用。
但後者需要注意方括號[、]與條件表達式之間至少有一個空格。
test跟[] 的意思一樣
條件成立,狀態返回值是0
條件不成立,狀態返回值是1
條件表達式
- 我們這部分內容主要是介紹,測試語句中的[ 條件表達式] 這一部分,測試的結果使用echo $? 來查看
邏輯表達式
- 邏輯表達式一般用於判斷多個條件之間的依賴關係。
- 常見的邏輯表達式有: && 和||
&&
- 命令1 && 命令2
- 如果命令1執行成功,那麼我才執行命令2
如果命令1執行失敗,那麼命令2也不執行– 夫唱婦隨
||
- 命令1 || 命令2
- 如果命令1執行成功,那麼命令2不執行
如果命令1執行失敗,那麼命令2執行– 對着幹
示例:
[ 1=1 ] && echo "&&ok"
[ 1=2 ] && echo "$$nook"
[ 1=1 ] || echo "||ok"
[ 1=2 ] || echo "||nook"
&&ok
16057nook
文件表達式
- -f 判斷後面的內容是否是一個文件
- -d 判斷後面的內容是否是一個目錄
- -x 判斷後面的內容是否是一個可執行文件
示例:
#!/bin/bash
# 測試文件表達式:-f, -d, -x
# -f 判斷是否爲一個文件
[ -f 06_file_exp.sh ] && echo "ok"
# -d 判斷是否爲一個目錄
[ -d 06_file_exp.sh ] || echo "不是一個目錄"
# -x 判斷是否爲一個可執行文件
[ -x 06_file_exp.sh ] && echo "是一個可執行文件"
ok
不是一個目錄
數值操作符
- 主要根據給定的兩個值,判斷第一個與第二個數的關係,如是否大於、小於、等於第二個數。
- 常見選項如下:
- n1 -eq n2 相等
- n1 -gt n2 大於
- n1 -lt n2 小於
- n1 -ne n2 不等於
示例:
#!/bin/bash
# 測試數字比較操作符:-eq;-lt;-gt;-ne
[ 1 -eq 1 ] && echo '相等'
[ 1 -lt 2 ] && echo '小於'
[ 2 -gt 1 ] && echo '大於'
[ 2 -ne 1 ] && echo '不等於'
相等
小於
大於
不等於
字符換比較
- str1 == str2 str1和str2字符串內容一致
- str1 != str2 str1和str2字符串內容不一致
示例:
#!/bin/bash
# 測試字符串之間的比較:str1==str2,str1!=str2
[ 'michael'=='michel' ] && echo '相等'
[ 'michael'!='jackson' ] && echo '不相等'
相等
不相等
計算表達式
- 計算表達式,簡單來說就是對具體的內容進行算數計算
- 格式:
- 方式一:
(( 計算表達式)),推薦使用
- 方式一:
- 方式二:
let let 計算表達式 - 注意:
$(())中只能用+-*/和()運算符,並且只能做整數運算
示例:
echo $((100/5))
20
i=1
let i=i+1
echo $i
2
總結:
- 標準的測試語句:[ 條件表達式 ]
- 四種條件表達式:
- 邏輯: &&(同林鳥) ||(對着幹)
- 文件: -f -d -x
- 數字: -ge -gt -lt -ne
- 字符串: == !=
- 兩種計算表達式:$((計算表達式)) let 變量名a=變量名a+1
linux常見符號
學習目標:
- 掌握兩種重定向符號的格式和使用場景
- 掌握管道符的特點和使用
- 掌握後臺展示符號的意義和作用
- 掌握信息符號的作用和使用場景
重定向符號
- 在shell腳本中有兩種常見的重定向符號> 和>>
- > 表示將符號左側的內容,以覆蓋的方式輸入到右側文件中
- >> 表示將符號左側的內容,以換行添加的方式追加到右側的文件中
示例
echo 'michael' > test.sh
cat test.sh
michael
echo 'jackson' > test.sh
cat test.sh
jackson
echo 'jackson' >> test.sh
cat test.sh
jackson
jackson
管道符號
- |,用來將|左邊的信息傳遞到|右邊的工具
- 使用格式:命令1 | 命令2
- 管道符左側命令1 執行後的結果,傳遞給管道符右側的命令2使用
示例:
env | grep SHELL
SHELL=/bin/bash
其他符號
後臺展示符號&
- 就是將一個命令從前臺轉到後臺執行
- 格式:命令 &
示例:
sleep 4
卡住4秒
sleep 10 &
後臺運行,不耽誤其他操作
全部信息符號2>&1
符號詳解:
- 1 表示正確輸出的信息
- 2 表示錯誤輸出的信息
- 2>&1 代表所有輸出的信息
示例:
bash 10_output_msg.sh 1 > zhengque
cat zhengque
bash 10_output_msg.sh 2 > cuowu
cat cuowu
bash 10_output_msg.sh > all_msg 2>&1
cat all_msg
linux系統垃圾桶
- /dev/null 是linux下的一個設備文件,
- 這個文件類似於一個垃圾桶,特點是:容量無限大
示例:
rm zehngque > /dev/null
本節內容小結:
- 重定向符號:
- >(覆蓋) >>(追加)
- 管道符:
- 信息傳遞, 從左到右
- 其他符號:
- 後臺展示符號: &
- 信息提取符號: 2>&1
- 垃圾桶符號: /dev/null
常見命令詳解
本節學習目標:
- 掌握grep 命令的格式和常用參數意義和使用場景
- 掌握sed 命令的格式和常用參數意義和使用場景
grep 命令詳解
定義
- grep命令是我們常用的一個強大的文本搜索命令
命令格式
- 命令格式:grep [參數] [關鍵字] <文件名>
- 注意:我們在查看某個文件的內容的時候,是需要有<文件名>
grep命令在結合|(管道符)使用的情況下,後面的<文件名>是沒有的
可以通過grep –help 查看grep的幫助信息
- 注意:我們在查看某個文件的內容的時候,是需要有<文件名>
參數解釋
- 參數詳解
- -c:只輸出匹配行的計數。
- -n:顯示匹配行及行號。
- -v:顯示不包含匹配文本的所有行。
示例:
模板文件:
find.txt
nihao aaa
nihao AAA
NiHao bbb
nihao CCC
- -c :輸出匹配到aaa的個數
grep -c aaa find.txt
1
- -n: 輸出匹配內容,同時顯示行號
grep -n CCC find.txt
4:nihao CCC
- -v:匹配到的內容部輸出,輸出不匹配的內容
grep -v ni find.txt
NiHao bbb
sed 命令詳解
定義
- seds是行文件編輯工具。因爲它編輯文件是以行爲單位的.
命令格式
- sed [參數] ‘<匹配條件> [動作]’ [文件名]
參數解釋
- 參數爲空表示sed的操作效果,實際上不對文件進行編輯
- -i 表示對文件進行編輯
- 注意:mac版本的bash中使用-i參數,必須在後面單獨加個東西: -i ”
匹配條件
- 匹配條件分爲兩種:數字行號或者關鍵字匹配
- 關鍵字匹配格式:
‘/關鍵字/’
- 注意:
隔離符號/ 可以更換成@、#、!等符號
根據情況使用,如果關鍵字和隔離符號有衝突,就更換成其他的符號即可。
- 注意:
動作詳解
- -a 在匹配到的內容下一行增加內容
- -i 在匹配到的內容上一行增加內容
- -d 刪除匹配到的內容
- -s 替換匹配到的內容
- 注意:
上面的動作應該在參數爲-i的時候使用,不然的話不會有效果
替換命令演示
- 關於替換,我們從三個方面來學習:
行號、列號、全體 - 命令格式:
sed -i [替換格式] [文件名] - 注意:替換命令的寫法
- ’s###’ —> ‘s#原內容##’ —> ‘s#原內容#替換後內容#’
- 樣式一:
sed -i ‘行號s#原內容#替換後內容#列號’ [文件名] - 樣式二:
sed -i ‘s#原內容#替換後內容#g’ [文件名]
示例:
模板文件
sed_test.txt
nihao sed sed sed
nihao sed sed sed
nihao sed sed sed
替換每行首個匹配內容:
- sed -i ‘s#原內容#替換後內容#’ 文件名
替換首每行的第1個sed爲SED
sed -i '' s#sed#SED# sed_test.txt
nihao SED sed sed nihao SED sed sed nihao SED sed sed
替換全部匹配內容
- sed -i ‘s#原內容#替換後內容#g’ 文件名
替換全部sed爲des
sed -i '' s#sed#des#g sed_test.txt
nihao des des des nihao des des des nihao des des des
指定行號替換首個匹配內容
- sed -i ” 行號s#原內容#替換後的內容# 文件名
替換第2行的首個SED爲sed
sed -i '' 2s#SED#sed# sed_test.txt
nihao SED SED SED nihao sed SED SED nihao SED SED SED
首行指定列號替換匹配內容
- sed -i ‘s#原內容#替換後內容#列號’ 文件名
替換每行的第2個SED爲sed
sed -i '' s#SED#sed#2 sed_test.txt
nihao SED sed SED nihao sed SED sed nihao SED sed SED
指定行號列號匹配內容
- sed -i ‘行號s#原內容#替換後內容#列號’ 文件名
替換第3行的第2個SED爲sed
sed -i '' 3s#SED#sed#2 sed_text.txt
nihao SED sed SED nihao sed SED sed nihao SED sed sed
增加操作
在指定行號的下一行增加內容
- 格式:
- sed -i ‘行號a\增加的內容’ 文件名
- 如果增加多行,可以在行號位置寫個範圍值,彼此間使用逗號隔開,例如
sed -i ‘1,3a\增加內容’ 文件名
示例: 在第二行下增加一行內容“insert-2”
sed -i '2a\zengjia-2' sed_text.txt
cat sed.txt
nihao SED sed SED
nihao sed SED
zengjia-2
nihao SED sed sed
指定1~3每行都增加內容
sed -i '1,3a\tongshi-2' sed_text.txt
cat sed_text.txt
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
在指定行號的當行增加內容
- 格式:
- sed -i ‘行號i\增加的內容’ 文件名
- 注意:
如果增加多行,可以在行號位置寫個範圍值,彼此間使用逗號隔開,例如
sed -i ‘1,3i\增加內容’ 文件名
示例:在第一行插入一行內容
sed -i '1i\insert-1' sed_text.txt
cat sed_text.txt
insert-1
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
刪除操作
- 指定行號刪除
- 格式:
- sed -i ‘行號d’ 文件名
- 注意:
如果刪除多行,可以在行號位置多寫幾個行號,彼此間使用逗號隔開,例如
sed -i ‘1,3d’ 文件名
示例:刪除第5行的內容
sed -i '5d' sed_text.txt
cat sed_text.txt
insert-1
nihao SED sed SED
tongshi-2
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
刪除第3-5行內容
sed -i '3,5d' sed.txt
cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao SED sed sed