Linux:高效編寫shell指令碼的10個建議
阿新 • • 發佈:2018-11-26
轉載地址: https://mp.weixin.qq.com/s/YmROxFBkfMxuh_VaaI4wtg
【Linux命令】 linux下高效編寫shell指令碼的10個建議
在Linux環境下工作 ,shell指令碼的編寫應該是一個必備的基本技能了,本文將分享 10 個寫出高效可靠的 shell指令碼的實用技巧
本文主要內容來源於《10 Useful Tips for Writing Effective Bash Scripts in Linux》,再加上自己的一點理解而成。如果你還有一些其他更好的指令碼程式設計經驗想要分享,在下面評論框分享出來吧。
1
在指令碼中多寫註釋
這條建議不但適合於shell指令碼,對於其它程式語言同樣實用。這樣做的好處是可以幫助他人或者你自己後面閱讀指令碼時能夠迅速瞭解指令碼的功能,便於維護。試想下,如果有一天你的主管給了你一堆沒有註釋的程式碼,你是不是很抓狂呢。
shell指令碼中,註釋一般以#開頭,後面跟著是註釋的內容。註釋不可少,但是註釋也不是越多越好,對於shell指令碼,註釋一般包括下面幾個部分:
1 #指令碼的引數
2 #指令碼的用途
3 #指令碼的注意事項
4 #指令碼的寫作時間,作者,版權等
5 #各個函式前的說明註釋6 #一些較複雜的單行命令註釋
2 #指令碼的用途
3 #指令碼的注意事項
4 #指令碼的寫作時間,作者,版權等
5 #各個函式前的說明註釋6 #一些較複雜的單行命令註釋
2
指令碼中有命令執行失敗時退出指令碼
如果指令碼中某條命令執行失敗,我們不應該讓其繼續執行,因為這樣可能會影響指令碼的其餘部分,導致邏輯錯誤。邏輯錯誤一般又是很難定位的,與其這樣,不如讓其提前結束更早的找出指令碼中的錯誤。可以用下面的命令設定在遇到命令失敗時來退出指令碼執行:
# 如果命令執行失敗讓指令碼退出執行
set -o errexit
# 或
set -e
set -o errexit
# 或
set -e
3
指令碼中使用到未宣告變數時退出指令碼
指令碼中使用到未宣告的變數同樣可能導致邏輯錯誤,可以用下面的命令設定指令碼在使用到未宣告的變數時退出執行:
# 若有用未設定的變數即讓指令碼退出執行
set -o nounset
# 或
set-u
set -o nounset
# 或
set-u
4
使用雙引號引用變數
當使用一個變數的值時,用雙引號有助於防止由於空格導致單詞分割開和由於識別和擴充套件了萬用字元而導致的不必要匹配,下面的例子說明了一切。
#!/bin/bash# 若命令失敗讓指令碼退出
set -o errexit
# 若未設定的變數被使用讓指令碼退出
set -o nounset
echo "Names without double quotes"
echo
names="Tecmint FOSSMint Linusay"
for name in $names; do
echo "$name
done
echo
echo "Names with double quotes"
echo
for name in "$names"; do
echo "$name"
done
exit 0
set -o errexit
# 若未設定的變數被使用讓指令碼退出
set -o nounset
echo "Names without double quotes"
echo
names="Tecmint FOSSMint Linusay"
for name in $names; do
echo "$name
done
echo
echo "Names with double quotes"
echo
for name in "$names"; do
echo "$name"
done
exit 0
5
在指令碼中多使用函式
同樣,這條建議也適用其它程式語言,函式的使用使得程式碼更模組化,更可讀和可重用;shell指令碼中定義函式的語法如下所示:
function check_root()
{
command1;
command2;
}
# 或
check_root()
{
command1;
command2;
}
{
command1;
command2;
}
# 或
check_root()
{
command1;
command2;
}
6
字串比較時用=而不是==
為什麼會有這個建議,原文並沒有給出詳細的說明,只是簡單的提了句: ==
是 =
的同義詞,因此僅用個單個 =
來做字串比較。不過在原文的後面有網友回答了,是因為==只適用於bash;POSIX形式是“=”,使用 = 更方便移植。
value1="tecmint.com"
value2="fossmint.com"
if [ "$value1" = "$value2" ]
value2="fossmint.com"
if [ "$value1" = "$value2" ]
7
用$(command) 代替傳統的`command`
這兩種形式都可以用作命令替換,所謂命令替換是用這個命令的輸出結果取代命令本身。這裡建議用 $(command)
而不是反引號 `command
`來做命令代換。
command
//不建議做法
user=`echo "$UID"`
建議做法user=
$(echo "$UID")
user=`echo "$UID"`
建議做法user=
$(echo "$UID")
8
用readonly宣告靜態變數
靜態變數不會改變;它的值一旦在指令碼中定義後就不能被修改,對於這類變數,在宣告的時候應該用readonly去宣告。
readonly passwd_file="/etc/passwd"
readonly group_file="/etc/group"
readonly group_file="/etc/group"
9
命名規範
由於在bash環境變數名字都是大寫,因此建議自己定義的變數用小寫字母命名,以防止命名衝突,同時命名時要做到顧名思義,你取的名字要有意義。
#而環境變數用大寫命名,自定義變數用小寫,
nikto_file="$HOME/Downloads/nikto-master"
nikto_file="$HOME/Downloads/nikto-master"