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

来源:https://www.cnblogs.com/surpassme/archive/2018/11/29/10041382.html
-Advertisement-
Play Games

[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,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • " 【.NET Core項目實戰 統一認證平臺】開篇及目錄索引 " 上篇文章我介紹瞭如何在網關上實現客戶端自定義限流功能,基本完成了關於網關的一些自定義擴展需求,後面幾篇將介紹基於 的認證相關知識,在具體介紹 實現我們統一認證的相關功能前,我們首先需要分析下 源碼,便於我們徹底掌握認證的原理以及後續 ...
  • 編輯文檔時,對一些需要修改的字元或段落可以通過查找替換的方式,快速地更改。在C# 在word中查找及替換文本一文中,主要介紹了在Word中以文本替換文本的方法,在本篇文章中,將介紹如何用一篇Word文檔、圖片或者表格來替換文檔中的指定文本字元串。示例要點如下: 1. 用文檔替換Word中的文本 2. ...
  • .NET、C#和ASP.NET三者之間的區別如下: 一、什麼是.NET?.NET是微軟公司下的一個開發平臺,.NET核心就是.NET Framwork(.NET框架)是.NET程式開發和運行的環境,在這個平臺下可以用不同的語言進行開發,因為.NET是跨語言的一個平臺。語言可以是C#,f#,j#,vb ...
  • 在開發項目的時候,我們為了提高速度和質量,往往不是白手起家,需要基於一定的基礎上進行項目的快速開發,這樣可以利用整個框架的生態基礎模塊,以及成熟統一的開發方式,可以極大提高我們開發的效率。本篇隨筆就是介紹基於Winform開發框架或混合框架基礎上進行項目的快速開發,這個主題在之前的一些隨筆有一定的介... ...
  • 微風陣陣清香襲,笑語聲聲入耳際。 白花綠葉簇紅衣,巧手雙舞汗珠滴。 腰間布兜漸鼓起,行走艱難如孕妻。 不顧擦汗忙脫衣,過稱緊奔下家地。 霧天歸來 霞飛雲龍翱翔天,白霧遮日樹不見。 團團煙霧繞村轉,行人悠悠仙下凡。 鬍子眉毛結冰寒,聖誕老人到凡間。 老伴起早去磨面,回家好像仙翁現。 ...
  • ASP.NET -- WebForm: HttpRequest類的方法和屬性 ...
  • crond 什麼是? crond 是linux系統中用於定期執行命令或指定程式任務的服務。一般情況下,安裝完系統操作之後,預設會啟動任務調度服務。 linux調度任務的工作可以分為兩類: 系統自身執行的工作:系統周期性執行的任務工作,如:輪詢系統日誌,備份系統數據,清理緩存等 用戶執行的工作:某個用 ...
  • 最近在開發dueros的技能,官方提供的PHPSDK中有多個實力,而運行實例的命令如下是 nohup php -S 0.0.0.0:8029 myindex.php & 從命令來看,肯定是在8029啟動了一個服務,因為之前從來沒有用過這個Linux命令,所以對這個命令很好奇。比如,這個命令的標準格式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...