成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教你寫出健壯可靠的shell腳本!

系統 Linux
如果秉承著能跑就行的態度寫shell腳本,是很自在的,但是如果你想要寫出健壯,可靠的shell腳本,可沒那么容易。那么有什么可操作的經驗或者方法嗎?

教你寫出健壯可靠的shell腳本!

如果秉承著能跑就行的態度寫shell腳本,是很自在的,但是如果你想要寫出健壯,可靠的shell腳本,可沒那么容易。那么有什么可操作的經驗或者方法嗎?

語法檢查

第一個最簡單的方法就是利用工具對腳本進行檢查,這一部分已經在《有了這個神器,再也不怕shell寫不對了》中介紹過了,它能最大程度地發現shell腳本中存在的語法錯誤,如果你還不知道,建議你絕對不要錯過。

而為了保證腳本健壯可靠,那么就需要保證腳本在一些特殊的情況及早出現,避免漏網之魚。來看看有哪些可行的技巧。

腳本失敗時即退出

可以在腳本的開頭設置如下:

  1. set -e 

舉個例子:

  1. #!/bin/bash
  2. set -e
  3. lp #這里運行會出錯
  4. date 

這種情況下,運行一旦出錯就會退出,不放過一個問題:

  1. $ ./test.sh
  2. lp: Error - no default destination available. 

當然了,這也有不好的地方,有時候命令執行本來就可能是失敗的,你還是希望它繼續,可以臨時加上|| true:

  1. #!/bin/bash
  2. set -e
  3. lp || true 
  4. date 

不過個人覺得這樣的設置用處不是特別大,因為很多時候就是需要處理不同的錯誤情況,而這樣只能要么遇到錯誤退出,要么認為正確,導致無法走到異常分支。

通過set +e設置回來:

  1. set -e
  2. #command
  3. set +e
  4. #other command 

打印腳本執行過程

調試階段,你可能想知道整個過程是執行了哪些命令,每條命令都具體執行了什么,可以利用下面的方式執行:

  1. sh -x test.sh 

或者,和上面類似,在開頭加上set -x:

 

  1. //來源:公眾號【編程珠璣】
  2. //作者:守望先生
  3. #!/bin/bashset -x
  4. if [ $# -lt 1 ]
  5. then 
  6. echo "no para"
  7. else 
  8. echo "para 1 $1"
  9. fi 

執行時,輸出如下:

  1. + [ 0 -le 1 ]+ echo no parano para 

前面帶+的內容就是命令實際執行的,你可以看到比較條件是什么,變量被展開成了具體內容,走到了哪個分支,非常清楚。

顯示未定義的變量

shell中變量沒有定義,仍然是可以使用的,但是它的結果可能不是你所預期的。舉個例子:

 

  1. //來源:公眾號【編程珠璣】
  2. //作者:守望先生
  3. #!/bin/bash
  4. if [ "$var" = "abc" ]
  5. then 
  6. echo " not abc"
  7. else 
  8. echo " abc "
  9. fi 

這里本來想判斷var的內容是否為abc,實際上var并沒有定義,但是在這里使用并沒有報錯,如果我們想早點發現這類問題,避免在復雜的腳本中問題被掩蓋,那么可以在開頭加上:

  1. set -u 

再次運行就會提示:

  1. test.sh: 5: test.sh: num: parameter not set 

再想象一下,你本來想刪除:

  1. rm -rf $dir/* 

然后dir是空的時候,變成了什么?

是不是有種后背發涼的感覺?

管道命令一個失敗時整個失敗

有時候我們可能會執行類似這樣的命令:

  1. cat test.sh |grep if | cut -d ';' -f 2 

三條命令一行執行,如果我們希望在其中一條失敗,整個命令就失敗,而避免執行后面無意義的命令,那么可以在開始設置:

  1. set -o pipefail 

不設置的情況下,cat test.sh即使執行失敗了,后面的grep實際上還會繼續執行,可能會導致一些意想不到的情況發生,如果不想這樣的情況發生,那么這樣設置是有幫助的。

對于靜態變量使用readonly

通常我們會在腳本開頭定義一些靜態變量:

  1. MY_PATH=/usr/bin 

而為了避免MY_PATH被意外修改,可以這樣:

  1. readonly MY_PATH=/usr/bin 

這樣的話,一旦后面有命令嘗試修改,就會報錯。

  1. #!/bin/bashreadonly MY_PATH=/usr/binMY_PATH=/usr/local/bin 

運行一下試試:

  1. $ ./test.shtest.sh: 3: test.sh: MY_PATH: is read only 

看,給你提示了!

給變量設置可選的初始值

例如:

  1. name=${1:-shouwang}echo "${name}" 

這里讓name為$1,即第一個參數,而當它為空時,令name為shouwang。

多條命令執行使用&&

例如:

  1. cmd0;cmd1;cmd1 

這里如果cmd0失敗了,后面的命令仍然會執行,而如果不希望后面的命令執行,可以使用:

  1. cmd0 && cmd1 && cmd1 

使用函數

腳本本身比較短還好,而腳本一旦變長,不使用函數,將使得腳本很難維護,可讀性也很差。

總結

實際上最開始介紹的腳本檢查工具就已經非常有效了,基本的錯誤都能檢查出來,而其他的內容,更多的是關注于腳本調試,不放過任何一個可能的錯誤。

最后,還是優先推薦shellcheck工具。 

 

責任編輯:龐桂玉 來源: Linux學習
相關推薦

2020-07-15 08:17:16

代碼

2020-12-09 08:35:45

Shell腳本語法

2016-09-26 14:16:18

shell腳本bash

2016-09-19 15:15:01

shellbash腳本

2024-09-30 14:38:47

2020-02-27 16:17:31

代碼規范codegithub

2021-03-01 12:37:10

Shell腳本端口

2023-07-31 08:45:10

Shell腳本

2010-08-16 10:10:22

SQL腳本

2024-12-11 08:10:53

2023-11-28 07:36:41

Shell腳本部署

2020-04-08 10:21:58

bash腳本語言

2020-04-14 09:22:47

bash腳本技巧

2024-11-27 09:19:25

2019-08-09 13:50:08

shellLinux

2021-05-12 10:17:15

Shell工具Linux

2013-09-04 09:59:49

監控 Shell 腳本

2018-05-14 15:55:28

LinuxBash

2020-10-30 12:42:06

TypeScript編程開發

2017-08-11 17:20:07

LinuxShell
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩综合在线 | 欧美激情 一区 | 户外露出一区二区三区 | 天天干夜夜操 | 少妇午夜一级艳片欧美精品 | 不卡一区二区三区四区 | 日本精品一区二区三区在线观看视频 | 日韩av视屏 | 欧美乱人伦视频 | 日韩一区二区三区在线观看视频 | www.天天操| 国产在线二区 | 中文字幕视频在线观看 | 欧美一区二区三区在线播放 | 夜夜爽99久久国产综合精品女不卡 | h视频免费在线观看 | a在线免费观看 | 精品久久久久久久久久久久 | 欧美亚洲在线视频 | 欧美精品久久久久 | 91一区二区三区 | 不用播放器看的av | 亚洲国产一区二区三区在线观看 | 三级在线免费观看 | 国产又色又爽又黄又免费 | 日韩中文字幕视频 | 免费视频一区二区 | 国产精品91久久久久久 | 久久伊 | 久久国产精品一区二区三区 | 亚洲福利在线观看 | 欧美视频三区 | 亚洲精品久久区二区三区蜜桃臀 | 国产一级片免费在线观看 | 毛片a级毛片免费播放100 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 国产成人精品综合 | 成人免费视频网站在线看 | 国产精品久久久久久久久久免费 | 在线成人免费av | 91精品一区 |