自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

系統(tǒng) Linux
如果秉承著能跑就行的態(tài)度寫shell腳本,是很自在的,但是如果你想要寫出健壯,可靠的shell腳本,可沒(méi)那么容易。那么有什么可操作的經(jīng)驗(yàn)或者方法嗎?

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

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

語(yǔ)法檢查

第一個(gè)最簡(jiǎn)單的方法就是利用工具對(duì)腳本進(jìn)行檢查,這一部分已經(jīng)在《有了這個(gè)神器,再也不怕shell寫不對(duì)了》中介紹過(guò)了,它能最大程度地發(fā)現(xiàn)shell腳本中存在的語(yǔ)法錯(cuò)誤,如果你還不知道,建議你絕對(duì)不要錯(cuò)過(guò)。

而為了保證腳本健壯可靠,那么就需要保證腳本在一些特殊的情況及早出現(xiàn),避免漏網(wǎng)之魚(yú)。來(lái)看看有哪些可行的技巧。

腳本失敗時(shí)即退出

可以在腳本的開(kāi)頭設(shè)置如下:

  1. set -e 

舉個(gè)例子:

  1. #!/bin/bash
  2. set -e
  3. lp #這里運(yùn)行會(huì)出錯(cuò)
  4. date 

這種情況下,運(yùn)行一旦出錯(cuò)就會(huì)退出,不放過(guò)一個(gè)問(wèn)題:

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

當(dāng)然了,這也有不好的地方,有時(shí)候命令執(zhí)行本來(lái)就可能是失敗的,你還是希望它繼續(xù),可以臨時(shí)加上|| true:

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

不過(guò)個(gè)人覺(jué)得這樣的設(shè)置用處不是特別大,因?yàn)楹芏鄷r(shí)候就是需要處理不同的錯(cuò)誤情況,而這樣只能要么遇到錯(cuò)誤退出,要么認(rèn)為正確,導(dǎo)致無(wú)法走到異常分支。

通過(guò)set +e設(shè)置回來(lái):

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

打印腳本執(zhí)行過(guò)程

調(diào)試階段,你可能想知道整個(gè)過(guò)程是執(zhí)行了哪些命令,每條命令都具體執(zhí)行了什么,可以利用下面的方式執(zhí)行:

  1. sh -x test.sh 

或者,和上面類似,在開(kāi)頭加上set -x:

 

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

執(zhí)行時(shí),輸出如下:

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

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

顯示未定義的變量

shell中變量沒(méi)有定義,仍然是可以使用的,但是它的結(jié)果可能不是你所預(yù)期的。舉個(gè)例子:

 

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

這里本來(lái)想判斷var的內(nèi)容是否為abc,實(shí)際上var并沒(méi)有定義,但是在這里使用并沒(méi)有報(bào)錯(cuò),如果我們想早點(diǎn)發(fā)現(xiàn)這類問(wèn)題,避免在復(fù)雜的腳本中問(wèn)題被掩蓋,那么可以在開(kāi)頭加上:

  1. set -u 

再次運(yùn)行就會(huì)提示:

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

再想象一下,你本來(lái)想刪除:

  1. rm -rf $dir/* 

然后dir是空的時(shí)候,變成了什么?

是不是有種后背發(fā)涼的感覺(jué)?

管道命令一個(gè)失敗時(shí)整個(gè)失敗

有時(shí)候我們可能會(huì)執(zhí)行類似這樣的命令:

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

三條命令一行執(zhí)行,如果我們希望在其中一條失敗,整個(gè)命令就失敗,而避免執(zhí)行后面無(wú)意義的命令,那么可以在開(kāi)始設(shè)置:

  1. set -o pipefail 

不設(shè)置的情況下,cat test.sh即使執(zhí)行失敗了,后面的grep實(shí)際上還會(huì)繼續(xù)執(zhí)行,可能會(huì)導(dǎo)致一些意想不到的情況發(fā)生,如果不想這樣的情況發(fā)生,那么這樣設(shè)置是有幫助的。

對(duì)于靜態(tài)變量使用readonly

通常我們會(huì)在腳本開(kāi)頭定義一些靜態(tài)變量:

  1. MY_PATH=/usr/bin 

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

  1. readonly MY_PATH=/usr/bin 

這樣的話,一旦后面有命令嘗試修改,就會(huì)報(bào)錯(cuò)。

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

運(yùn)行一下試試:

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

看,給你提示了!

給變量設(shè)置可選的初始值

例如:

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

這里讓name為$1,即第一個(gè)參數(shù),而當(dāng)它為空時(shí),令name為shouwang。

多條命令執(zhí)行使用&&

例如:

  1. cmd0;cmd1;cmd1 

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

  1. cmd0 && cmd1 && cmd1 

使用函數(shù)

腳本本身比較短還好,而腳本一旦變長(zhǎng),不使用函數(shù),將使得腳本很難維護(hù),可讀性也很差。

總結(jié)

實(shí)際上最開(kāi)始介紹的腳本檢查工具就已經(jīng)非常有效了,基本的錯(cuò)誤都能檢查出來(lái),而其他的內(nèi)容,更多的是關(guān)注于腳本調(diào)試,不放過(guò)任何一個(gè)可能的錯(cuò)誤。

最后,還是優(yōu)先推薦shellcheck工具。 

 

責(zé)任編輯:龐桂玉 來(lái)源: Linux學(xué)習(xí)
相關(guān)推薦

2020-07-15 08:17:16

代碼

2020-12-09 08:35:45

Shell腳本語(yǔ)法

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

代碼規(guī)范codegithub

2021-03-01 12:37:10

Shell腳本端口

2024-12-11 08:10:53

2023-07-31 08:45:10

Shell腳本

2010-08-16 10:10:22

SQL腳本

2023-11-28 07:36:41

Shell腳本部署

2020-04-08 10:21:58

bash腳本語(yǔ)言

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

2018-05-14 15:55:28

LinuxBash

2013-09-04 09:59:49

監(jiān)控 Shell 腳本

2020-10-30 12:42:06

TypeScript編程開(kāi)發(fā)

2018-08-28 16:02:59

LinuxShellBash
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)