[TOC] Shell腳本規範 良好的代碼規範不僅方便閱讀,也利於維護和提升開發效率。因此建議大家在編寫Shell腳本時養成良好的代碼習慣。今天就和大家探討一下在Shell腳本中的一些規範,詳細如下所示: 1、在Shell腳本中,第一行指定腳本解釋器,如下所示: 2、在S ...
目錄
Shell腳本規範
良好的代碼規範不僅方便閱讀,也利於維護和提升開發效率。因此建議大家在編寫Shell腳本時養成良好的代碼習慣。今天就和大家探討一下在Shell腳本中的一些規範,詳細如下所示:
- 1、在Shell腳本中,第一行指定腳本解釋器,如下所示:
#!/bin/bash
或
#!/bin/sh
- 2、在Shell腳本中填寫代碼作者、日期、版權等信息,便於協同開發
- 3、Shell腳本中的註釋,儘量採用英文註釋,避免中文註釋,可避免本機或切換系統環境後出現亂碼,如果必須採用中文,建議按在腳本中添加以下環境變數
export LANG="zh_CN.UTF-8"
- 4、腳本命名需要簡潔明瞭且以.sh作為擴展名
- 5、腳本儘量存放在固定的路徑中,便於查找、調用和維護
- 6、代碼編寫技巧如下所示:
> a):成對的符號儘量一次書寫完整,而後再向裡面添加內容,這樣可以避免遺漏符號。
如 {} [] '' " " ``
> b):[ ]和[[ ]] 兩端至少要留有一個空格
> c):對於if/for/while/select/case 等應一次將格式寫完,而後再添加對應的處理語句
> d):代碼中應註意縮進,便於閱讀,可使用TAB或空格,一般建議採用空格鍵進行縮進
> e):字元串賦值給變數應加雙引號("")並且等號前後不能有空格
如 str="Test"
> f):腳本中的書寫必須為英文狀態下的符號、字母等。
- 7、全局變數(環境變數)的定義需要全部大寫,其名稱需要一看便知其意,定義需要使用export
- 8、局部變數(普通變數)命名需要遵循一定的命名規則,如駝峰語法;風格要統一
- 9、Shell函數中的變數可以使用local方式進行定義,使之僅在該函數體內有效,從而避免與外部程式的變數相同,造成程式異常
[root@localhost Test]# cat local.sh
#!/bin/bash
function Test () {
local i # 定義本地變數,僅在函數體內有效
for((i=0;i<5;i++))
do
echo "in function i is:" ${i}
done
}
Test
i=100
echo "not in function i is:"${i}
[root@localhost Test]# bash local.sh
in function i is: 0
in function i is: 1
in function i is: 2
in function i is: 3
in function i is: 4
not in function i is:100
- 10、在引用變數時,若變數前後都有字元,則需要使用${variable}進行引用,避免產生歧義;當變數為字元串時,需要使用"${variable}"進行引用;當變數為整數時,則可以直接使用$variable進行引用。
- 11、對於一些經常變化的信息,建議採用變數或位置參數等進行定義和使用。
- 12、腳本中要檢查配置項是否為空,是否可執行等,增加腳本的健壯性。
Shell腳本調試
相比於其他編程語言,Shell腳本沒有專門的IDE去進行各類細緻的調試。但我們可以通過運行Shell腳本的錯誤提示和列印信息來進行排錯和糾錯。
常見錯誤示例
- 1、if語句缺少結尾關鍵字
[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 if [ -f /root/Test/a.sh ]
3 then
4 echo "/root/Test/a.sh exist"
5 else
6 echo "/root/Test/a.sh no exist" # 缺少fi
[root@localhost Test]# bash testif.sh
testif.sh:行7: 語法錯誤: 未預期的文件結尾
在上面提示中,顯示第7行存在錯誤,依據該提示,我們可以仔細觀察錯誤提示的前後,應該不難找出錯誤。
在運行Shell腳本出現錯誤後,不能單看提示的錯誤行,需要結合提示行前後進行排錯。Shell不會對腳本錯誤進行精確定位,這個也是區別於其他語言的地方。
- 2、迴圈語句中缺少關鍵字或關鍵字拼寫不正確
[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 while
3 do
4 if [ -f /root/Test/a.sh ]
5 then
6 echo "/root/Test/a.sh exist"
7 else
8 echo "/root/Test/a.sh no exist" # 結尾少了done
[root@localhost Test]# bash testif.sh
testif.sh:行3: 未預期的符號 `do' 附近有語法錯誤
testif.sh:行3: ` do'
- 3、成對的符號落了單
[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 #while
3 #do
4 if [ -f /root/Test/a.sh # 缺少 ]
5 then
6 echo "/root/Test/a.sh exist"
7 else
8 echo "/root/Test/a.sh no exist"
9 fi
[root@localhost Test]# bash testif.sh
testif.sh: 第 4 行:[: 缺少 `]'
/root/Test/a.sh no exist
- 4、[]和[[]]兩端缺少空格
[root@localhost Test]# cat testif.sh
#!/bin/bash
#while
#do
if [-f /root/Test/a.sh] # [] 兩端沒有空格
then
echo "/root/Test/a.sh exist"
else
echo "/root/Test/a.sh no exist"
fi
[root@localhost Test]# bash testif.sh
testif.sh:行4: [-f: 未找到命令
Shell調試技巧
- 1、Windows中編寫腳本明明語法什麼均正確,在Linux中跟卻提示各種語法錯誤,這種情況建議優先在Linux寫腳本。因為Windows中和格式與Linux格式還是有很多差異的。
- 2、在代碼關鍵地方列印日誌,如使用echo
- 3、使用bash命令參數調試,常用調試參數如下所示:
> -n : 不執行腳本僅檢查腳本語法是否存在錯誤
> -v : 先將腳本內容顯示到屏幕再執行執行腳本
> -x : 將執行腳本的內容及輸出全部顯示到屏幕上
以上參數示例如下,所示:
-n參數示例:
[root@localhost Test]# cat -n testif.sh
1 #!/bin/bash
2 #while
3 #do
4 if [ -f /root/Test/a.sh ]
5 then
6 echo "/root/Test/a.sh exist"
7 else
8 echo "/root/Test/a.sh no exist"
9 # 缺少結束標誌 fi
[root@localhost Test]# bash -n testif.sh
testif.sh:行10: 語法錯誤: 未預期的文件結尾
-v參數示例:
[root@localhost Test]# bash -v testif.sh # 顯示腳本內容並執行腳本
#!/bin/bash
#while
#do
if [ -f /root/Test/a.sh ]
then
echo "/root/Test/a.sh exist"
else
echo "/root/Test/a.sh no exist"
fi
/root/Test/a.sh no exist # 腳本執行結果
-x參數示例:
[root@localhost Test]# cat -n sum.sh
1 #!/bin/bash
2 function Sum () {
3 for((i=1;i<=$1;i++))
4 do
5 ((sum=sum+i))
6 echo "{1..$1} sum is :" ${sum}
7 done
8 }
9
10 Sum $1
11 if [ $? == "0" ]
12 then
13 echo "Completed"
14 else
15 echo "Error"
16 fi
[root@localhost Test]# bash -x sum.sh 5
+ Sum 5
+ (( i=1 ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 1
{1..5} sum is : 1
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 3
{1..5} sum is : 3
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 6
{1..5} sum is : 6
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 10
{1..5} sum is : 10
+ (( i++ ))
+ (( i<=5 ))
+ (( sum=sum+i ))
+ echo '{1..5} sum is :' 15
{1..5} sum is : 15
+ (( i++ ))
+ (( i<=5 ))
+ '[' 0 == 0 ']'
+ echo Completed
Completed
前面帶有"+"表示執行的過程語句,沒有帶"+"則表示輸出的結果,通過-x參數可以查看整個執行的過程中每一步
Shell調試總結
- 1、如果在Windows中編寫的腳本在Linux中無法運行時,可使用工具dos2unix或Notepad++轉換為Linux格式
- 2、Shell腳本運行中的報錯並不像其他高級語言一樣詳細,在排錯時需要結合前後代碼段進行排查糾錯
- 3、在調試中可使用bash自帶的參數進行調試定位問題點
- 4、平時養成良好的代碼習慣和規範,可以規避部分常識性的錯誤
Shell編程基礎篇到此已經介紹完畢。本系列也僅僅入門系統,如果還要繼續深入學習,還需要多看看別人優秀的代碼,做到多看多練,方能更進一步。
本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註: