shell腳本嵌套
㈠ shell腳本的常用循環
在簡單介紹shell腳本(shell script)之前,先簡單介紹一下shell。
在計算機科學中, shell (殼層)指「為用戶提供用戶界面」的軟體,通常指的是命令行界面的解析器。一般來說,這個詞是指操作系統中,提供訪問內核所提供之服務的程序。Shell也用於泛指所有為用戶提供操作界面的程序,也就是程序和用戶交互的介面。因此與之相對的是程序內核(英語:Kernel),內核不提供和用戶的交互功能。
不過這個詞也拿來指應用軟體,或是任何在特定組件外圍的軟體,例如瀏覽器或電子郵件軟體是HTML排版引擎的shell。Shell這個詞是來自於操作系統(內核)與用戶界面的外層界面。
通常將shell分為兩類:命令行與圖形界面。命令行殼層提供一個命令行界面(CLI);而圖形殼層提供一個圖形用戶界面(GUI)。
shell腳本 (英語:shell script),又稱shell命令稿、程序化腳本,是一種電腦程序與文本文件,內容由一連串的shell命令組成,經由Unix Shell直譯其內容後運作。被當成是一種腳本語言來設計,其運作方式與解釋型語言相當,由Unix shell扮演命令行解釋器的角色,在讀取shell腳本之後,依序運行其中的shell命令,之後輸出結果。利用shell腳本可以進行系統管理,文件操作等。
在Unix及所有的類Unix系統中,如Linux、FreeBSD等操作系統,都存在shell腳本。依照Unix shell的各種不同類型,shell腳本也有各種不同方言,如 Bourne shell (sh), Bourne-Again shell (bash), C shell (csh)等等。在DOS、OS/2、Microsoft Windows中的批處理文件,跟shell腳本有類似的功能。
常見的shell腳本循環語法包括for、while和until。除此之外,還有一些其他語法,能夠實現循環(遍歷)功能。和循環相關的還有循環控制符break和continue,用於控制流程轉向。
for循環屬於「當型循環」,即「當滿足條件的時候執行」。
for循環有三種類型:
常見的數值for循環語法還有:
for file in $( ls )語法的等效語法有很多,如下:
或者
類C風格的for循環,和C沒有太大的區別,這里只進行示例,不再贅述。
或者
結果:
也稱為前測試循環語句,重復次數是利用一個條件來控制是否繼續重復執行這個語句。為了避免死循環,必須保證循環體中包含循環出口條件即表達式存在退出狀態為非0的情況。例如,計算1~100以內所有的奇數之和:
當然,條件可以使字元串,可以是輸入值,可以是標記等,此處不再贅述。
until命令和while命令類似,while能實現的功能until也可以實現。但區別是until循環的退出狀態是為0(與while剛好相反),即whie循環在條件為真時繼續執行循環,而until則在條件為假時執行循環。
例如,計算1~100以內所有的奇數之和:
select結構從技術角度看不能算是循環結構,只是相似而已,它是bash的擴展結構用於互動式菜單顯示,功能類似於case結構,但是比case的交互性要好。在遍歷列表功能中,select結構可以實現循環的功能。
例如,以下選擇,只有選擇white的時候,退出循環
在循環語法中,經常需要根據條件控制循環退出或跳過本次執行,這時候就需要用到循環控制符。循環控制符主要包括兩個:break和continue。
循環控制符和C以及Java等常見語法功能類似,在理不再贅述,只給出常用示例。
在for、while和until循環中break可強行退出循環。
注意 :break語句僅能退出當前的循環,如果是兩層循環嵌套,則需要在外層循環中使用break。
例如,計算1~100以內所有的奇數之和:
在for、while和until中用於讓腳本跳過其後面的語句,執行下一次循環。
例如,顯示10以內能被3整除的正整數。
以上是自己在學習Linux的過程中的一部分總結,和大家共享。同時,也參考了其他人的博客,在參考列表中列出來了。
㈡ shell腳本中的if中多條件語句如何寫。
可以使用 if-elif-else 語法來寫多條件語句。
1、首先要理解if-else的基本用法,if條件+then操作+else操作+fi閉合,書寫方法如下:
2、 shell語法中[[ ]]和[ ]的主要區別
(1) [ ] 實際上是bash 中 test 命令的簡寫。即所有的 [ expr ] 等於 test expr。
對 test 命令來說, 用 -eq 要進行數字比較,而你此時傳入字元串,就報錯了。
(2) [[ ]] 是內置在shell中的一個命令,它比test強大的多。支持字元串的模式匹配(使用=~操作符時甚至支持shell的正則表達式)。邏輯組合可以不使用test的-a,-o而使用&& ||。
㈢ Linux Shell 腳本編程最佳實踐
IT路邊社
前言
與其它的編碼規范一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時也討論一些約定及編碼標准。這份文檔主要側重於我們所普遍遵循的規則,對於那些不是明確強制要求的,我們盡量避免提供意見。
編碼規范對於程序員而言尤為重要,有以下幾個原因:
本文檔中的准則致力於最大限度達到以下原則:
盡管本文檔涵蓋了許多基礎知識,但應注意的是,沒有編碼規范可以為我們回答所有問題,開發人員始終需要再編寫完代碼後,對上述原則做出正確的判斷。
注 :未明確指明的則默認為必須(Mandatory)
主要參考如下文檔:
僅建議Shell用作相對簡單的實用工具或者包裝腳本。因此單個shell腳本內容不宜太過復雜。
在選擇何時使用shell腳本時時應遵循以下原則:
可執行文件不建議有擴展名,庫文件必須使用 .sh 作為擴展名,且應是不可執行的。
執行一個程序時,無需知道其編寫語言,且shell腳本並不要求具有擴展名,所以更傾向可執行文件沒有擴展名。
而庫文件知道其編寫語言十分重要,使用 .sh 作為特定語言後綴的擴展名,可以和其他語言編寫的庫文件加以區分。
文件名要求全部小寫, 可以包含下劃線 _ 或連字元 - , 建議可執行文件使用連字元,庫文件使用下劃線。
正例:
反例:
源文件編碼格式為UTF-8。避免不同操作系統對文件換行處理的方式不同,一律使用 LF 。
每行最多不超過120個字元。每行代碼最大長度限制的根本原因是過長的行會導致閱讀障礙,使得縮進失效。
除了以下兩種情況例外:
如出現長度必須超過120個字元的字元串,應盡量使用here document或者嵌入的換行符等合適的方法使其變短。
示例:
除了在行結束使用換行符,空格是源文件中唯一允許出現的空白字元。
對從來沒有用到的或者被注釋的方法、變數等要堅決從代碼中清理出去,避免過多垃圾造成干擾。
Bash 是唯一被允許使用的可執行腳本shell。
可執行文件必須以 #!/bin/bash 開始。請使用 set 來設置shell的選項,使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數及路徑不需要引號 grep -li Hugo /dev/ "$1"
# 示例8:常規變數用雙引號,ccs可能為空的特殊情況可不用引號 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號,$1可能為空的特殊情況可不用引號 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數傳遞推薦帶引號的"$@",所有參數作為單字元串傳遞用帶引號的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當執行 ./t.sh a b c 時輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:
使用 $(command) 而不是反引號。
因反引號如果要嵌套則要求用反斜杠轉義內部的反引號。而 $(command) 形式的嵌套無需轉義,且可讀性更高。
正例:
反例:
條件測試
使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。
因為在 [[ 和 ]] 之間不會出現路徑擴展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯。且 [[ ... ]] 支持正則表達式匹配,而 [ ... ] 不支持。參考以下示例:
盡可能使用變數引用,而非字元串過濾。
Bash可以很好的處理空字元串測試,請使用空/非空字元串測試方法,而不是過濾字元,讓代碼具有更高的可讀性。正例:
反例:
正例:
反例:
正例:
反例:
文件名擴展
當進行文件名的通配符擴展時,請指定明確的路徑。
當目錄中有特殊文件名如以 - 開頭的文件時,使用帶路徑的擴展通配符 ./* 比不帶路徑的 * 要安全很多。
應該避免使用eval。
Eval在用於分配變數時會修改輸入內容,但設置變數的同時並不能檢查這些變數是什麼。反例:
請使用進程替換或者for循環,而不是通過管道連接while循環。
這是因為在管道之後的while循環中,命令是在一個子shell中運行的,因此對變數的修改是不能傳遞給父shell的。
這種管道連接while循環中的隱式子shell使得bug定位非常困難。反例:
如果你確定輸入中不包含空格或者其他特殊符號(通常不是來自用戶輸入),則可以用for循環代替。例如:
使用進程替換可實現重定向輸出,但是請將命令放入顯式子 shell,而非 while 循環創建的隱式子 shell。例如:
總是檢查返回值,且提供有用的返回值。
對於非管道命令,使用 $? 或直接通過 if 語句來檢查以保持其簡潔。
例如:
當內建命令可以完成相同的任務時,在shell內建命令和調用外部命令之間,應盡量選擇內建命令。
因內建命令相比外部命令而言會產生更少的依賴,且多數情況調用內建命令比調用外部命令可以獲得更好的性能(通常外部命令會產生額外的進程開銷)。
正例:
反例:
載入外部庫文件不建議用使用.,建議使用source,已提升可閱讀性。正例:
反例:
除非必要情況,盡量使用單個命令及其參數組合來完成一項任務,而非多個命令加上管道的不必要組合。常見的不建議的用法例如:cat和grep連用過濾字元串; cat和wc連用統計行數; grep和wc連用統計行數等。
正例:
除特殊情況外,幾乎所有函數都不應該使用exit直接退出腳本,而應該使用return進行返回,以便後續邏輯中可以對錯誤進行處理。正例:
反例:
推薦以下工具幫助我們進行代碼的規范:
原文鏈接:http://itxx00.github.io/blog/2020/01/03/shell-standards/
獲取更多的面試題、腳本等運維資料點擊: 運維知識社區 獲取
腳本之---簡訊轟炸機
腳本之---QQ微信轟炸機
ansible---一鍵搭建redis5.0.5集群
elk7.9真集群docker部署文檔
全球最全loki部署及配置文檔
最強安全加固腳本2.0
一鍵設置iptbales腳本