1. 程式人生 > >Shell編程-12-Shell腳本規範及調試

Shell編程-12-Shell腳本規範及調試

結合 自帶 顯示 大寫 exist 解釋器 處理 一個空格 href

目錄

  • Shell腳本規範
  • Shell腳本調試

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,或掃描下面的二維碼添加關註:
技術分享圖片

Shell編程-12-Shell腳本規範及調試