Linux中shell腳本發(fā)現(xiàn)BUG和提高效率的神器—"set"方法
set是 Linux Shell 中的一個(gè)內(nèi)置命令,用于設(shè)置或顯示 shell 的選項(xiàng)和環(huán)境變量。以下是關(guān)于 set 命令的基礎(chǔ)概念、優(yōu)勢(shì)、類(lèi)型、應(yīng)用場(chǎng)景以及常見(jiàn)問(wèn)題的解答。不管我們是做嵌入式Linux研發(fā)人員,還是做運(yùn)維人員,都會(huì)或多或少去查看編寫(xiě) shell 腳本,你遇到問(wèn)題是否也只會(huì)用一行一行echo去查看腳本分析問(wèn)題。這樣效率過(guò)于慢,今天教大家set關(guān)鍵字方法輕松分析遇到的問(wèn)題
set的常用命令選項(xiàng)
set
用于設(shè)置或取消設(shè)置 Shell
選項(xiàng)、位置參數(shù),以及顯示變量和函數(shù)定義。它的用法非常廣泛,主要包括以下幾個(gè)方面:
設(shè)置/取消 Shell 選項(xiàng)
- 顯示變量:不帶參數(shù)時(shí),
set
會(huì)列出當(dāng)前Shell的所有變量(包括環(huán)境變量)和函數(shù)定義13。 - 設(shè)置選項(xiàng):通過(guò)
-
或+
啟用/禁用Shell特性(如調(diào)試、錯(cuò)誤處理等)14。-
:開(kāi)啟選項(xiàng)(如set -x
啟用命令調(diào)試)+
:關(guān)閉選項(xiàng)(如set +x
關(guān)閉調(diào)試)14。
set
可以啟用或禁用 Shell
的運(yùn)行選項(xiàng),語(yǔ)法如下:
set -<option> # 啟用選項(xiàng) set +<option> # 禁用選項(xiàng)
常用選項(xiàng)
設(shè)置位置參數(shù)
set 可以重新設(shè)置腳本的位置參數(shù):
set -- arg1 arg2 arg3 # 設(shè)置 $1="arg1", $2="arg2", $3="arg3"
示例
set -- "first" "second" "third" echo "$1" # 輸出 "first" echo "$2" # 輸出 "second"
執(zhí)行腳本結(jié)果如下
顯示所有變量和函數(shù)
不帶參數(shù)的 set
會(huì)顯示所有變量:
set # 顯示所有變量
ubuntu上的環(huán)境變量都可以打印出來(lái),腳本里的變量打印不出來(lái)
處理帶空格的參數(shù)
set
可以正確處理帶空格的參數(shù):
set -- "Hello World" "Bash Script" echo "$1" # 輸出 "Hello World"(保留引號(hào))
執(zhí)行腳本結(jié)果如下
調(diào)試腳本
set -x
和 set -v
常用于調(diào)試
#!/bin/bash set -x # 打印執(zhí)行的命令 echo "Debug mode" set +x # 關(guān)閉調(diào)試
打開(kāi)調(diào)試效果如下
恢復(fù)默認(rèn)選項(xiàng)
set - # 恢復(fù)所有選項(xiàng)為默認(rèn)值
顧名思義就是將之前的 set
的參數(shù)改回默認(rèn)選項(xiàng)
錯(cuò)誤退出
set -e
常用于一個(gè)命令返回一個(gè)非0退出狀態(tài)值(失敗),就立刻退出
下面舉一個(gè)單獨(dú)使用set -e
的例子
#!/bin/bash set -e # 啟用錯(cuò)誤退出 echo "第一行正常執(zhí)行" ls /home/forlinx/1.txt # 這個(gè)命令會(huì)失敗 echo "這行不會(huì)被執(zhí)行,因?yàn)槟_本已經(jīng)退出"
執(zhí)行腳本結(jié)果如下
會(huì)發(fā)現(xiàn)腳本最后一行echo沒(méi)有打印出來(lái)
set -E
常和trap函數(shù)結(jié)合一起使用更容易發(fā)現(xiàn)腳本里哪條指令發(fā)生錯(cuò)誤
下面舉個(gè)set -E
的例子
#!/bin/bash set -eE # 同時(shí)啟用錯(cuò)誤退出和錯(cuò)誤追蹤 # 設(shè)置錯(cuò)誤處理函數(shù) trap'echo "錯(cuò)誤捕獲: 在行號(hào) $LINENO, 命令: $BASH_COMMAND, 狀態(tài)碼: $?"' ERR my_function() { echo"在函數(shù)內(nèi)執(zhí)行" ls /不存在的目錄 # 這里會(huì)失敗 echo"這行不會(huì)執(zhí)行" } echo"腳本開(kāi)始" my_function echo"這行也不會(huì)執(zhí)行"
看下執(zhí)行腳本結(jié)果
會(huì)發(fā)現(xiàn)打印兩次錯(cuò)誤發(fā)生在: ls /home/pan
便于開(kāi)發(fā)者更容易發(fā)現(xiàn)到哪條指令發(fā)生錯(cuò)誤
在項(xiàng)目中,set -e
和set -E
更多是在一起使用,便于更方便調(diào)試腳本,這樣更快速定位到哪條指令發(fā)生問(wèn)題退出腳本
#!/bin/bash set -eE # 同時(shí)啟用錯(cuò)誤退出和錯(cuò)誤追蹤 # 設(shè)置錯(cuò)誤處理函數(shù) trap'echo "錯(cuò)誤捕獲: 在行號(hào) $LINENO, 命令: $BASH_COMMAND, 狀態(tài)碼: $?"' ERR my_function() { echo"在函數(shù)內(nèi)執(zhí)行" ls /不存在的目錄 # 這里會(huì)失敗 echo"這行不會(huì)執(zhí)行" } echo"腳本開(kāi)始" my_function echo"這行也不會(huì)執(zhí)行"
查看腳本執(zhí)行結(jié)果
會(huì)發(fā)現(xiàn)確實(shí)比set -e
時(shí)錯(cuò)誤提示更加明顯,會(huì)多提示一行錯(cuò)誤發(fā)生的指令
注意事項(xiàng)
- 選項(xiàng)可組合使用(如
set -eu
); - 子Shell繼承父Shell的選項(xiàng)設(shè)置,但修改不影響父Shell;
- 恢復(fù)默認(rèn)選項(xiàng)可用
set +選項(xiàng)
(如set +x
)。
總結(jié)
本篇我們學(xué)會(huì)了常用的set
關(guān)鍵字語(yǔ)法可以讓你的 shell 腳本提高更改 bug 調(diào)試效率,本篇學(xué)會(huì)的同學(xué)可以一鍵支持三連下,歡迎關(guān)注公眾號(hào)[Linux隨筆錄](méi),持續(xù)分享干貨!
到此這篇關(guān)于Linux中shell腳本發(fā)現(xiàn)BUG和提高效率的神器—"set"方法的文章就介紹到這了,更多相關(guān)Linux中shell腳本"set"方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析使用?Auditbeat?模塊監(jiān)控?shell?命令的問(wèn)題
Auditbeat Audited 模塊可以用來(lái)監(jiān)控所有用戶在系統(tǒng)上執(zhí)行的 shell 命令,在終端用戶偶爾才會(huì)登錄的服務(wù)器上,通常需要進(jìn)行監(jiān)控,本文給大家介紹使用?Auditbeat?模塊監(jiān)控?shell?命令的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-02-02shell進(jìn)程監(jiān)控的實(shí)現(xiàn)(ps、sleep、kill)
本文主要介紹了shell進(jìn)程監(jiān)控的實(shí)現(xiàn)(ps、sleep、kill),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06提取oralce當(dāng)天的alert log的shell腳本代碼
提取oralce當(dāng)天的alert log的shell腳本代碼,需要的朋友可以參考下2013-02-02寫(xiě)一個(gè)shell腳本實(shí)現(xiàn)視頻處理
Linux和Unix都擁有很多能夠處理圖像和視頻文件的應(yīng)用程序和工具,下面這篇文章主要給大家介紹了關(guān)于如何寫(xiě)一個(gè)shell腳本來(lái)實(shí)現(xiàn)視頻處理的相關(guān)資料,需要的朋友可以參考下2022-07-07Linux 連續(xù)執(zhí)行多條命令的方法(推薦)
下面小編就為大家?guī)?lái)一篇Linux 連續(xù)執(zhí)行多條命令的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02linux C語(yǔ)言開(kāi)發(fā)管道通信實(shí)例詳解
這篇文章主要介紹了linux C語(yǔ)言開(kāi)發(fā)管道通信實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01