Linux中shell腳本發(fā)現(xiàn)BUG和提高效率的神器—"set"方法
set是 Linux Shell 中的一個內置命令,用于設置或顯示 shell 的選項和環(huán)境變量。以下是關于 set 命令的基礎概念、優(yōu)勢、類型、應用場景以及常見問題的解答。不管我們是做嵌入式Linux研發(fā)人員,還是做運維人員,都會或多或少去查看編寫 shell 腳本,你遇到問題是否也只會用一行一行echo去查看腳本分析問題。這樣效率過于慢,今天教大家set關鍵字方法輕松分析遇到的問題
set的常用命令選項
set 用于設置或取消設置 Shell 選項、位置參數(shù),以及顯示變量和函數(shù)定義。它的用法非常廣泛,主要包括以下幾個方面:
設置/取消 Shell 選項
- 顯示變量:不帶參數(shù)時,
set會列出當前Shell的所有變量(包括環(huán)境變量)和函數(shù)定義13。 - 設置選項:通過
-或+啟用/禁用Shell特性(如調試、錯誤處理等)14。-:開啟選項(如set -x啟用命令調試)+:關閉選項(如set +x關閉調試)14。
set 可以啟用或禁用 Shell 的運行選項,語法如下:
set -<option> # 啟用選項 set +<option> # 禁用選項
常用選項

設置位置參數(shù)
set 可以重新設置腳本的位置參數(shù):
set -- arg1 arg2 arg3 # 設置 $1="arg1", $2="arg2", $3="arg3"
示例
set -- "first" "second" "third" echo "$1" # 輸出 "first" echo "$2" # 輸出 "second"
執(zhí)行腳本結果如下

顯示所有變量和函數(shù)
不帶參數(shù)的 set 會顯示所有變量:
set # 顯示所有變量
ubuntu上的環(huán)境變量都可以打印出來,腳本里的變量打印不出來

處理帶空格的參數(shù)
set 可以正確處理帶空格的參數(shù):
set -- "Hello World" "Bash Script" echo "$1" # 輸出 "Hello World"(保留引號)
執(zhí)行腳本結果如下

調試腳本
set -x 和 set -v 常用于調試
#!/bin/bash set -x # 打印執(zhí)行的命令 echo "Debug mode" set +x # 關閉調試
打開調試效果如下

恢復默認選項
set - # 恢復所有選項為默認值
顧名思義就是將之前的 set 的參數(shù)改回默認選項
錯誤退出
set -e 常用于一個命令返回一個非0退出狀態(tài)值(失敗),就立刻退出
下面舉一個單獨使用set -e的例子
#!/bin/bash set -e # 啟用錯誤退出 echo "第一行正常執(zhí)行" ls /home/forlinx/1.txt # 這個命令會失敗 echo "這行不會被執(zhí)行,因為腳本已經(jīng)退出"
執(zhí)行腳本結果如下

會發(fā)現(xiàn)腳本最后一行echo沒有打印出來
set -E 常和trap函數(shù)結合一起使用更容易發(fā)現(xiàn)腳本里哪條指令發(fā)生錯誤
下面舉個set -E的例子
#!/bin/bash
set -eE # 同時啟用錯誤退出和錯誤追蹤
# 設置錯誤處理函數(shù)
trap'echo "錯誤捕獲: 在行號 $LINENO, 命令: $BASH_COMMAND, 狀態(tài)碼: $?"' ERR
my_function() {
echo"在函數(shù)內執(zhí)行"
ls /不存在的目錄 # 這里會失敗
echo"這行不會執(zhí)行"
}
echo"腳本開始"
my_function
echo"這行也不會執(zhí)行"看下執(zhí)行腳本結果

會發(fā)現(xiàn)打印兩次錯誤發(fā)生在: ls /home/pan 便于開發(fā)者更容易發(fā)現(xiàn)到哪條指令發(fā)生錯誤
在項目中,set -e和set -E更多是在一起使用,便于更方便調試腳本,這樣更快速定位到哪條指令發(fā)生問題退出腳本
#!/bin/bash
set -eE # 同時啟用錯誤退出和錯誤追蹤
# 設置錯誤處理函數(shù)
trap'echo "錯誤捕獲: 在行號 $LINENO, 命令: $BASH_COMMAND, 狀態(tài)碼: $?"' ERR
my_function() {
echo"在函數(shù)內執(zhí)行"
ls /不存在的目錄 # 這里會失敗
echo"這行不會執(zhí)行"
}
echo"腳本開始"
my_function
echo"這行也不會執(zhí)行"查看腳本執(zhí)行結果

會發(fā)現(xiàn)確實比set -e時錯誤提示更加明顯,會多提示一行錯誤發(fā)生的指令
注意事項
- 選項可組合使用(如
set -eu); - 子Shell繼承父Shell的選項設置,但修改不影響父Shell;
- 恢復默認選項可用
set +選項(如set +x)。
總結
本篇我們學會了常用的set關鍵字語法可以讓你的 shell 腳本提高更改 bug 調試效率,本篇學會的同學可以一鍵支持三連下,歡迎關注公眾號[Linux隨筆錄],持續(xù)分享干貨!
到此這篇關于Linux中shell腳本發(fā)現(xiàn)BUG和提高效率的神器—"set"方法的文章就介紹到這了,更多相關Linux中shell腳本"set"方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解git無法pull倉庫refusing to merge unrelated histories
這篇文章主要介紹了詳解git無法pull倉庫refusing to merge unrelated histories的相關資料,需要的朋友可以參考下2017-06-06
shell腳本實現(xiàn)同時多臺遠程主機執(zhí)行命令的代碼分享
這篇文章主要給大家介紹了關于shell腳本實現(xiàn)同時多臺遠程主機執(zhí)行命令的方法,文中給出了詳細的代碼示例,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03

