一文掌握shell腳本的基本語法
歡迎大家star我的GitHub:https://github.com/SolerHo/geeks-shell
00. 使用環境和說明
centos8
Kernel 4.18.0-305.12.1.el8_4.x86_64
x86_64 GNU/Linux
bash 版本:4.4.20
本文不介紹和Linux 指令相關的內容
先修內容:Linux基本命令(推薦書籍:《鳥哥Linux私房菜:基礎學習》)
只介紹本人在場景中使用后,結合參考書籍做的一個學習筆記,未使用過的暫時不更新
部分圖片來源書籍《高級Bash腳本編程指南》
所有筆記的內容均可通過 cmd --help 查看具體的用法
01. shell概述
在shell中,每個腳本的開頭都使用 #! ,就是告知系統文件的執行都需要指定一個解釋器。指定一個文件類型的特殊標記。占用 2 字節 。
1.1 腳本解釋器
shell極腳本都是以 #!開頭,告知系統該文件的執行需要一個解釋器。
常見的解釋器類型如下:
#!/bin/sh #!/bin/bash #!/usr/bin/perl #!/usr/bin/tcl #!/bin/sed -f #!/usr/awk -f
解釋說明
#!/bin/sh linux系統上默認是bash,多數UNIX商業OS中也默認shell。
1.2 調用腳本
執行腳本的三種方式:
#方式1 sh helloworld.sh #方式2 bash helloworld.sh bash +x helloworld.sh
第三種方式有一點特殊
./helloworld.sh #需給文件授予執行權限 #實授予權限的方式如下 chmod +x helloworld.sh #授予可執行權限 chmod +rx helloworld.sh #授予任何人可執行可讀和可執行權限 chmod u+rx helloworld.sh #只給腳本的所有者可讀和可執行權限
1.3 第一個腳本helloworld
#!/bin/bash echo "helloworld"
目前Linux/unix系統中,普遍的shell腳本的第一行是:#!/bin/sh 或者 #!/bin/bash。
1.4 Linux管道
在Linux中可以將兩個或者多個命令連接到一起的符號(|),稱為管道符。
思想:把上一個命令的輸出作為下一個命令的輸入(也就是因連接而形成管道(pipe)概念)。
語法格式:
command_1 | command_2 | ... | command_N # 最簡單的管道 cat helloworld.sh | grep hello
??注意:有輸出才能輸入,所以輸出出現錯誤,則輸入部分將無法處理。
管道的應用:在grep、tail、cat、sed、awk等Linux命令中較為常見。
02. shell中特殊字符
03. 轉義符
轉義符是一種引用單個字符的方法。添加轉義符(\) 使得shell中的某個字符失去原有特殊含義。
注意:在echo 和 sed 中謹慎使用轉義符,否則會有相反效果。
賦值給變量的字符串的元素也會被轉義, 但是不能把一個單獨的轉義符賦值給變量。
04. shell中參數:
04. shell中參數:$0、$?、$!、$$、$*、$#、$@
、$?、$!、$$、$*、$#、$@$* 和 $# 的區別:
不被雙引號包含時,兩者沒有區別。
當被雙引號包含時, $* 是將所有參數看作一整個數據。而 $# 則是將每個參數看作一個數據。
具體實例腳本:
#!/bin/bash # 已進行shellcheck檢查 echo "This is $0 ---- :
#!/bin/bash # 已進行shellcheck檢查 echo "This is \$0 ---- : $0" echo "This is \$1 ---- : $1" echo "This is \$2 ---- : $2" echo "This is \$? ---- : $?" echo "This is \$$ ---- : $$" echo "This is \$! ---- : $!" echo "This is \$_ ---- : $_" echo "This is \$* ---- : $*" echo "This is \$@ ---- : $*@" echo "This is \$# ---- : $#"
" echo "This is $1 ---- : " echo "This is $2 ---- : " echo "This is $? ---- : $?" echo "This is $$ ---- : $$" echo "This is $! ---- : $!" echo "This is $_ ---- : $_" echo "This is $* ---- : $*" echo "This is $@ ---- : $*@" echo "This is $# ---- : $#"直接執行且打印信息如下:
bash +x paramshell.sh 7 77 #打印信息 This is
bash +x paramshell.sh 7 77 #打印信息 This is $0 ---- : paramshell.sh # 顯示文件名 This is $1 ---- : 7 # 第1個參數 This is $2 ---- : 77 # 第2個參數 This is $? ---- : 0 # 執行完畢后的返回值 0 --- True,1 --- False This is $$ ---- : 1549879 # 該程序執行時的本身進程ID This is $! ---- : # shell后臺運行的進程ID This is $_ ---- : This is $! ---- : # 變量保存之前執行命令的最后一個參數的值 This is $* ---- : 7 77 # 參數值列表 This is $@ ---- : 7 77 # 參數值列表 This is $# ---- : 2 # 參數的個數
---- : paramshell.sh # 顯示文件名 This is ---- : 7 # 第1個參數 This is ---- : 77 # 第2個參數 This is $? ---- : 0 # 執行完畢后的返回值 0 --- True,1 --- False This is $$ ---- : 1549879 # 該程序執行時的本身進程ID This is $! ---- : # shell后臺運行的進程ID This is $_ ---- : This is $! ---- : # 變量保存之前執行命令的最后一個參數的值 This is $* ---- : 7 77 # 參數值列表 This is $@ ---- : 7 77 # 參數值列表 This is $# ---- : 2 # 參數的個數5. 變量問題
變量表示數據的方法。是計算機為了保存數據項而在內存中分配的一個位置或一組位置的標識或名字。
變量名就是保存值的地方。
5.1 shell變量概述
shell變量有系統變量和自定義變量兩種。
對于變量名的聲明規則類似于其他編程語言。由字母、數字、下劃線組成,但不能以數字開頭。
hello_123 # 合法 123_hello # 不合法
5.2 內部變量(系統變量)
主要記錄實際工作中使用的,也不要記住。用到了再查即可。
5.3 自定義變量基本語法
定義變量:變量名=變量值,等號兩側不能有空格(與其它語言可設空格的區別之處)。變量名一般習慣使用大寫。
設置變量:set 變量名=變量值。
刪除變量:unset 變量名=變量值。
聲明靜態變量:readonly 變量名,靜態變量不能用unset
使用變量:$變量名
變量賦值
簡單賦值:a=123 && echo $a
命令行賦值給變量
#使用反引號 str=`cat helloworld.sh` #直接使用 $(..)格式 os=$(cat /etc/os-release)
局部變量:只在代碼塊或函數中可見可用。外部不可用。
Bash變量:不區分類型,都是字符串,不允許進行數值計算,除非變量中包含數字。
如果變量的值中間有空格,則使用引號(單引號或雙引號均可)擴起來。
5.4 環境變量
會影響用戶接口和shell的行為。環境變量是一個全局變量。
通過 export 命令將變量聲明為環境變量即可。
export 變量名=變量值 # 方式 1 :直接export導入,命令行窗口重啟后失效 export LD_LIBRARY_PATH=/usr/local/cuda/lib # 方式 2 # 加入到 root目錄下的 .bashrc 中 # 使用 source ./bashrc 使修改后的配置信息生效,命令行窗口重啟或者機器重啟均不會失效 # 查看環境變量是否生效 echo $變量名 echo $LD_LIBRARY_PATH
對于環境變量的查看
# 方式 1 :查看所有變量(包括環境變量和自定義變量) set # 方式 2 :只能查看環境變量 env
5.5 引用變量
引用:將字符串使用雙引號擴起來。作用:保護字符串的特殊字符(通配符)不被shell重新解釋或者擴展。
[root@centos8 data]# var01=3 [root@centos8 data]# echo $var01 3
在引用變量時,需要使用$來進行引用變量的值。
變量在使用過程中,如果沒有$作為前綴,需要思考如下情況:
被聲明或被賦值。
是否被unset
被使用export方式導入
是否作為信號量。
賦值的兩種方式:
使用 = 方式。
直接使用read命令。
6. 運算符
6.1 賦值運算符符
=: 通用賦值操作符,可用于算術和字符串的賦值。
6.2 算術運算符
??注意:運算符(+|-|*|/|%)= 表示:將變量的值(+|-|*|/|%)另一個常量值,然后再將結果賦值給變量。
具體實例:
#!/bin/bash # 未進行shellcheck檢查 a=5 let a+=2 echo "plus : $a " # a = 7 和 let a-=2 echo "minus : $a" # a = 5 差 let a*=2 echo "multi : $a" # a = 10 積 let a/=2 echo "div : $a" # a = 5 商 let a%=2 echo "Modulo : $a" # a = 1 余數
6.3 位運算符
使用較少,暫時不做更新學習。
6.4 比較運算符
6.5 邏輯運算符
7. 操作字符串
字符串是由單引號('') 或者 雙引號("") 或者也可不用引號。
單引號
原樣輸出(變量依然原樣輸出)
單引號內不能再使用單引號。
雙引號
如果其中使用了變量,則變量內容也會被替換。
如果再次使用引號,則使用轉義符。
不用引號
性質和雙引號一致,但是字符串不能有空格。
7.1 字符串的長度
直接使用 ${#string} 來計算字符串的長度
# 3 個語法格式 ${#string} # 方式 1 expr length $string # 方式 2 expr "$string" : '.*' # 方式 3 # 具體實例 str="hello world" echo "After using #str : ${#str}" echo "Use expr length : $(expr length "$str")" # 該方式不建議使用,因為shellcheck也建議使用第一種方式 echo "Use expr : $(expr "$str" : '.*')"
7.2 索引子串第一次出現的位置
# 語法格式 : expr index "$string" '$substring' # 詳細實例 ---- 未進行shellcheck檢查 str="SolerHO123456" echo $(expr index "$str" H) # 結果為 6
7.3 提取子串
目的:提取一些特殊需求的字符。
7.4 子串截除
7.5 子串替換
8. 數組
bash支持只支持一維數組。數組元素可使用符號 var[number] 來初始化。
腳本使用 declare -a var 語句來指定一個數組。
數組訪問:通過下標的方式訪問 — ${var[number]}。數組元素的下標由0開始,和C語言類似。下標可以是整數或算術表達式,其值應大于或等于0。
在數組中,${#array[*]} 和 ${#array[@]} 表示數組中元素的個數。
8.1 初始化方式
shell中使用括號來表示數組,元素之間則使用 空格符號 分隔。
# 等號兩邊不能空格 array_name=(element_1 element_2 ... element_N) # 聲明偶數 arr_odd=(1 3 5 7 9)
8.2 獲取數組中的元素
# 數組名[索引] 方式 $(array_name[index]) # 示例 echo ${arr_odd[2]}
打印數組中所有元素
${arr_odd[*]} # 建議使用該方式 ${arr_odd[@]} # 該方式在shellcheck中會無法認可,對
在數組聲明時添加一個額外的 declare -a語句,可加速后續的數組操作速度。
declare -a arr_name=(...)
8.3 刪除數組元素
在shell中,使用unset命令來刪除數組元素。語法格式:
# 刪除特定的元素 unset array_name[index] # 刪除整個數組 unset array_name # 使用數組名,不寫下標
8.4 二維數組
二維數組本質也是一維數組。通過 行 和 列 的尋址方式來對數組進行引用和操作。
在一維數組中由單行組成,而二維數組由連續的多行組成。
9. 分支與循環控制
雙中括號[[ ... ]] 結構
在bash中,引入 [[ ... ]] 擴展測試命令。這種方式一般直接使用數學符號判斷時使用。例如
if [[ "" > "" ]];then
雙圓括號((...)) 結構
允許進行算術擴展和賦值。例如:a=$(( 5 + 3 ))。該風格類似于C語言風格中的變量操作處理方式。
9.1 if和if嵌套
if/then結構用來判斷命令列表的退出狀態碼是否為0。
if單分支
語法格式:
if [ condition ];then command1 command2 ... fi # 注意不能少了fi結尾 #例如 if [ "" -gt 18 ];then echo "you are an adult" fi
if多分支
語法格式:
if [ condition ];then command1 command2 ... else command3 fi #例如 if [ "" -gt 18 ];then echo "you are an adult" else echo "You are a minor and you should study hard" fi
if嵌套
語法格式:
if [ condition1 ];then if [ condition2 ];then command1 ... fi fi
9.2 for循環
語法格式:
# [list] 是一個列表,類似list1 list2 list3 ... listN for arg in [list];do #如果do和for在同一行,則注意中間加個分號 command1 command2 ... done
具體實例:
# 方式 1 for i in {1..4};do # 類似python中使用in的方式判斷 echo "This is No $i" done # 方式 2 for((i=1;i<=5;i++));do # 類似C語言風格來實現 echo "This is No $i" done
9.3 while循環語句
在循環的開頭判斷條件是否滿足,如果條件為True,則一直循環。
while適合循環次數未知的情況。
語法格式:
while [ condition ];do command1 command2 ... done
具體實例:計算兩個數字之間的和(程序很簡單,是本人Test所以加了一些說明)
echo "-------This program calculates the sum of all the numbers between two numbers-------" echo "please inpput first number (need Must be less than the second number): " read a echo "Please input second number (Must be greater than the first number): " read b sum=0 while ((a <= b));do ((sum+=a)) ((a++)) done echo "the plus is : $sum"
9.4 until循環語句
在循環的頂部判斷條件,如果condition為False,就進入循環,和while語句相反。
語法格式:
until condition;do # 如果condition為True,直接結束循環 command1 command2 ... done
實例:計算1~50的乘積
#程序使用C語言風格,如果使用shellcheck是會直接報錯 set i=1 sum=0 until ((i>50));do ((sum+=i)) ((i++)) done echo "The puls is : $sum"
9.5 break和continue語句
直接影響循環行為的命令:break 和 continue。
和C語言的方式一致,不做過多說明。
break 直接跳出循環
continue 只跳過本次循環,忽略本次循環剩余代碼,直接進入下一次循環。
9.6 case結構語句
case結構語句類似C語言中的switch語句。個人使用場景:寫多個dockerfile(如ubuntu16.04、ubuntu18.04、centos7.2等)則使用一個變量控制,保證會執行的命令。
語法格式:
case arg/expression in condition_1) command_1 ;; condition_2) command_2 ;; ...... condition_N) command_N ;; *) command esac
??注意:
每句測試行,都以右小括號)結尾.
每個判斷語句塊都以一對分號;; 結尾。
case塊以 esac(case的反向拼寫) 結尾。
具體實例:打印成績評級
#已進行shellcheck檢查 echo "Please input your Score : " read -r score case $score in #固定格式,判斷數字,然后直接類似C語言中的goto語句 [9][0-9]|100) # 十位 和個位的組合 echo "The Level is A" ;; # 固定格式 [8][0-9]|90) echo "The Level is B" ;; [67][0-9]|80) echo "The Level is C" ;; [0-5][0-9]|[0-9]) echo "The Level is D, please pay attention it" ;; *) #固定格式 echo "The input is False" esac # 注意結尾不能少
9.7 select結構語句
select結構語句和case結構語句類似,是建立menu的一種工具。
select是從ksh中引入。
語法格式:
select arg in [list];do command_1 command_2 ...... break # 一定要使用break,否則會直接一直提示你選擇內容,無法退出(只能通過ctrl+c方式進行) done
提示用戶輸入選擇的內容(比如放在變量列表中). 注意: select命令使用PS3提示符, 默認為
(#?), 可修改。
具體實例:
#已進行shellcheck檢查 PS3="Please choose the OS you are using : " #直接將提示字符串賦值給PS3變量,即可替代符號 #? select os_type in "ubuntu1604" "Ubuntu1804" "Centos8" "OpenEuler";do echo "The OS you are using : $os_type" break done exit 0
10. 函數
函數:實現一系列操作的代碼塊(完成特定task)。一個函數就是一個子程序。
目的:提高代碼的重用性。
10.1 自定義函數
語法格式:
# 方式 1 function func_name(){ # function在shell中專門定義函數 command1 command2 ... [return value] } # 方式 2 : 簡化寫法 function_name(){ command1 command2 ... [return value] }
??注意:
關鍵字function可有可無。
函數定義必須在第一次調用函數之前完成。
一個函數可以嵌套另一個函數。
不用在函數中指明參數,只需在調用時傳遞參數即可。
10.2 函數的調用
在shell中,調用函數時可直接使用名字即可。如果有參數,設置即可。
func_name [param_1] [param_2] ... [param_N]
具體實例:
# 最簡單的例子 function print_infor(){ echo "My Name is : $1" echo "My Age is : $2" } print_infor solerho 26
10.5 系統函數
暫時未使用到,所以不做更新。
11. 字符串的顯示顏色
ANSI定義了屏幕屬性相關顏色輸出的轉義碼來表示。
一般會看到打印信息中顯示特殊的顏色。通過echo帶顏色屬性,以及參數 -e。語法格式如下:
# 方式 1 ---- 容易出現數字混亂 echo -e "\033[字背景顏色;文字顏色m 字符串\033[0m" # 方式 2 ---- 看起來簡潔 echo -e "\e[字背景顏色;文字顏色m 字符串\e[0m"
說明:echo中 -e 是啟用轉義序列。其中字體或者背景等編號都會以 m 結尾。
具體實例:
# 已進行shellcheck檢查 echo -e "\033[30m This is Black Font \033[1m" echo -e "\033[31m This is Red Font \033[1m" echo -e "\033[32m This is green Font \033[1m" echo -e "\033[33m This is yellow Font \033[1m" echo -e "\033[34m This is Blue Font \033[1m" echo -e "\033[35m This is Purple Font \033[1m" echo -e "\033[36m This is Cyan Font \033[1m" echo -e "\033[37m This is White Font \033[1m" echo -e "\033[40m This is Black background \033[1m" echo -e "\033[41m This is Red background \033[1m" echo -e "\033[42m This is green background \033[1m" echo -e "\033[43m This is yellow background \033[1m" echo -e "\033[44m This is Blue background \033[1m" echo -e "\033[45m This is Purple background \033[1m" echo -e "\033[46m This is Cyan background \033[1m" echo -e "\033[47m This is White background \033[1m"
打印信息如下:
更多詳細情況請移步 https://misc.flogisoft.com/bash/tip_colors_and_formatting
12. I/O重定向
該部分不談基本原理和具體實現,具體可查看 csapp 和 Linux內核中fd內容分析
shell腳本(Linux中保存log等操作也是如此)中,常用的I/O重定向相關的文件描述符(file description,簡寫fd)有3個:
stdin ----- 標準輸入 ----- 0 ----- 鍵盤
stdout ----- 標準輸出 ----- 1 ----- 屏幕
stderr ----- 標準錯誤 ----- 2 ----- 錯誤消息輸出到屏幕上
12.1 重定向符號及功能說明
12.2 關閉文件描述符
該使用場景本人暫未遇到,但是看到一些code在使用。
12.3 代碼塊重定向
代碼塊:就是 {} 括起來的命令。例如:for循環、while循環、until循環、case語句等。
具體用法:將重定向命令符號寫在代碼塊的結尾。具體實例:
echo "This is Code block redirect Example" echo { echo "SolerHO"; echo "shell"; echo "55" } > infor.log # 將代碼塊重定向輸出到infor.log 文件中 { read -r name; read -r dev_lang; read -r age } < infor.log # 將infor.log重定向輸入到代碼塊 echo "My Name is $name, The programming language being used is $dev_lang, age is $age"
13. 正則表達式
正則表達式(Regular Expression,簡稱regex或RE):由一系列的特殊字符組成的字符串,每個特殊字符都稱為 元字符(一般解釋為特定的含義)。
主要目的:用于搜索文本和字符串的操作。
一般情況下,可以通過 https://tool.oschina.net/regex/ 來驗證自己寫的是否可以匹配預期想要的結果。
13.1 正則表達式組成
正則表達式由普通字符和元字符(也稱為通配符)組成的集合,用來查找匹配特定規則的字符文本。
一個正則表達式中,會包含以下一種或者三種:
一個字符集:只包含表示字面意義的普通字符。
錨:指定所要匹配的文本在文件中所處的位置。如 ^ 和 $ 。
修飾符:擴大或縮小匹配范圍
常見的修飾符:星號(*)、括號和反斜杠(\)。
13.2 POSIX字符類 [:class:]
POSIX字符類通常都要用引號或雙中括號([[ ]])引起來。
13.2 擴展RE字符
13.1 應用場景
- Linux文本處理:sed、grep、awk、cat、tail、head、tee、uniq、sort - Linux工具:vim - 其他的編程語言
詳細關于正則表達式內容閱讀:https://www.runoob.com/regexp/regexp-tutorial.html
14. Linux / shell中一些命令說明
更多關于Linux相關的命令,請移步目錄 Linux 關注知識點筆記。
關于里面的參數選項則不做出過多解讀,只增加目前使用到的,后續有使用過其他的,也會再次更新。
14.1 set/ unset命令 – 設置/取消賦值
內容只介紹在實際生產中的情況,更多的細節請閱讀:https://www.computerhope.com/unix/uset.htm
在命令中直接輸入 set,則顯示系統中已經存在的一些shell變量。
設置新變量值
set var[n]=value set -ex var
參數選項
-e(errexit):如果命令的返回值不是0,則直接退出shll的執行。
-x():執行命令后,優先顯示該命令及對應的參數。
14.2 read命令 – 從控制臺讀取輸入
參考:https://www.computerhope.com/unix/bash/read.htm
從屏幕標準輸入中讀取一行。默認情況下,read將換行符作視為行的結尾。
read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] [name2 ...]
在while循環中使用的 -r 則是直接使用原始的輸入。例如
read -r name # 讀取控制臺輸入的name值 read -r age # 讀取控制前臺輸入的age值
14.3 declare命令 – 聲明shell變量
參考鏈接:https://www.computerhope.com/unix/bash/declare.htm
幾個功能
聲明shell變量和函數
設置屬性
顯示值
語法:
declare [-a] [-A] [-f] [-F] [-g] [-i] [-l] [-n] [-r] [-t] [-u] [-x] [-p] [name[=value]] [name[=value]] ...
具體使用的例子:
# 數組聲明中使用,可加速數組的操作速度 # shellcheck中也會無異常 declare -a arr[]=(...)
14.4 let命令 – 計算算術表達式
直接參考:https://www.computerhope.com/unix/bash/let.htm
功能:主要用于計算算術表達式。
let是Linux內置命令。而 ((...))是復合命令。
let arg [arg ...] # 和 ((...)) 直接計算算術表達式的思想類似 # 示例 let "var = 5";echo $var # 直接返回 5
14.5 expr命令 – 表達式
通用求值表達式:通過給定的操作(參數之間必須空格隔開)連接參數,并對參數求值。可使用算術、比較、字符串或邏輯操作。
expr 3 + 5 # 返回8 expr 3 \* 5 # 乘法符號需要轉義,返回15
字符串操作的請查看字符串部分。
14.6 test命令 – 判斷檢查
直接參考:https://www.computerhope.com/unix/test.htm
檢查文件類型并比較值。
# 語法 test expression # 應用 1:比較兩個字符串(一般是判斷字符串是否相等),比較運算符移步前面介紹部分 ---------> 比較運算符 # 應用 2:數字大小比較
15. Linux三劍客 — grep
grep ---- global regular expression print,通過正則表達式來進行多用途文本搜索,屬于一個過濾器。
語法格式:
grep [OPTION]... PATTERN [FILE]... # pattern 可以是要搜索的字符串,也可以正則表達式 # 擴展命令 egrep 等價于 grep -E # 擴展命令 fgrep 等價于 grep -F
15.1 常用查找option說明
15.2 輸出控制option說明
15.3 其他兩個常用RE進行的grep操作
顯示文件中以 “xxxx” 開頭的內容,使用符號 ^
cat xxxx.sh | grep "^xxxx" # 以字符xxxx開頭的內容行
示例:
顯示以 “xxxx” 結尾的文件名或者文件內容行,使用符號 $
cat xxxx.sh | grep "xxxx$" # 顯示以 xxxx 內容結尾的內容行
示例:
16. Linux三劍客 — sed
sed ----- stream editor,是文本處理工具。主要是查找并替換文本字符串等。
語法:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
目前常用的格式為:
sed -i 's/查找的字符串(可包含RE)/替代內容/g' filename # 如果在s/... /g 中包含單引號,則外面直接使用 雙引號(""),??注意中間使用一些特殊字符 sed -i "s/查找的字符串(可包含RE)/替代內容/g" filename
參數說明
i 一般是默認,可設置為其他option,具體 sed --help 查看。
s 查找
///分隔符,也可以是其他的字符。例如在Jenkins的pipeline語法中使用時(sed -i "s#search_word#target_word#g" filename)
g 表示直接全局替換 ----- global replacement。如果是需要忽略大小寫時,可使用gi
幾個具體的使用場景:vim命令行模式中操作和直接操作文本是相同原理
16.1 替換/修改字符串
# 全局替換(vim亦可),且忽略大小寫 sed -i "s/Hello/This is/g" helloworld.sh # 將文件helloworld.sh 中 Hello替換為 This is # 指定行替換(vim亦可),區分大小寫 sed "10,20 s/42m/46m/g" color_print.sh # 將color_print.sh中10~20行之間的顏色42m替換成46m
16.2 換行、刪除
sed -i "s/ /\n/g" helloworld.sh # 將文件中空格全部換行(\n) sed "/\//d" helloworld.sh # 將文件中的 /所在的行直接刪除(也就是#!/bin/bash)
16.3 注釋
# 全局刪除 sed "/^#\|^$\| *#/d" checkpip_deps.sh # 將文件中注釋直接全部刪除
16.4 查看指定的行范圍的內容
sed -n -e "5,7p" [-e ...] font_color.sh # 查看指定范圍內的內容,可使用多個 -e來指定多個行區間 sed "5,7d" font_color.sh # 查看指定范圍之外的內容,可重復使用
17. Linux三劍客 — awk
awk ---- ,是報告可視化工具,文本格式化輸出工具。主要處理文本文件。
17.1 語法格式
awk [-F 分隔符] '{ACTION}' filenames awk [option] '{ACTION}'
17.2 awk的原理
從第1行到最后1行,逐行去掃描文件內容,然后找到匹配pattern的行,最后進行指定的ACTION。
未指定pattern,則所有行都會被處理。
未指定ACTION,則屏幕直接打印匹配到行的內容。
18. shell腳本靜態檢查 — shellcheck
詳細內容直接閱讀:https://github.com/koalaman/shellcheck,如下為使用方式:
安裝方式
# 方式 1 : 直接命令行方式安裝 apt-get install shellcheck # Ubuntu # centos暫時未使用 yum install ShellCheck,建議直接使用源碼方式安裝 # 方式 2 : 源代碼方式 wget https://github.com/koalaman/shellcheck/releases/download/v0.8.0/shellcheck-v0.8.0.linux.x86_64.tar.xz && tar -xf shellcheck-v0.8.0.linux.x86_64.tar.xz && cp shellcheck-v0.8.0/shellcheck /usr/bin/ # 查看shellcheck 版本 shellcheck --version
使用方式
直接調用shellcheck加上自己的腳本,可檢測一些語法或者格式問題等。
shellcheck testop.sh
顯示信息:
19. 參考資源
《高級bash腳本編程指南》
https://juejin.cn/post/6844904045329514504
https://juejin.cn/post/6962032698697187364
https://myshell-note.readthedocs.io/en/latest/index.html
https://github.com/koalaman/shellcheck
Linux Shell
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。