目錄
Shell腳本編寫技巧
Shell腳本中所有的變量都是按照字符串來存儲的
1 腳本編寫規範
編寫shell腳本的最終目的是實現某個特定的功能,爲了這個目的需要進行“合理合法”的操作,合理指腳本編寫好以後能夠實現最終的功能,合法指符合Shell腳本編寫的語法知識,使得BASH能夠順利執行腳本中的命令。
1.1 命名規範
對需要命名的地方使用準確而簡單的名字,再編寫Shell腳本時,需要命名的地方:
-
腳本名稱
-
變量名
-
函數名
可以參照匈牙利命名法。匈牙利命名法通過在變量名前面加上相應的小寫字母的符號標識作爲前綴,標識出變量的作用域,類型等。見名知意。
匈牙利命名法使用方式
(1)變量名稱由字母(a-z和A-Z)和數字組成,一般不使用下劃線。開頭字符可以是任意的字符。字符大小寫再Shell腳本中是敏感的。
實際應用中儘量減少使用字符的大小寫、字符加數字的方式來區別不同的變量。
(2)命名變量時,如果使用一個單詞不能表達變量的用途,可以使用多個單詞聯合表示,單詞之間使用下劃線連接,也可以將每個單詞的首字母大寫。
(3)命名時儘量做到函數名稱和實際功能相符合。儘量不要使用fun1()、fun2()這種名稱極爲接近的形式來進行命令。
1.2 註釋風格
Shell腳本中只支持一種註釋方式,就是使用‘#’來對井號後面的內容進行註釋。在執行Shell腳本時,註釋中的內容不會被執行的。
如果要輸出井號”#”,使用轉義字符反斜槓“\“ 。
當需要註釋的範圍比較大,工作量也比較大的。可以使用函數的形式間接地註釋。如下腳本
# 使用函數註釋
#!/bin/bash
fun()
{
echo this #is 'is'
echo 在註釋中使用雙引號
echo this # is "is"
}
如果在開發過程中,遇到大段的代碼需要臨時註釋起來,過一會兒又取消註釋,怎麼辦呢?每一行加個#符號太費力了,可以把這一段要註釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和註釋一樣的效果。
1.3 其他需要注意地規範
要在適當地地方使用空格和空行。增加腳本地可讀性。
-
在輸出結果中使用空行,使輸出結果一目瞭然
-
函數中模塊與模塊之間一般使用一個空行來將不同地模塊進行分隔
示例
# 腳本中使用空行
#!/bin/bash
fun1()
{
echo 函數fun1
}
echo 調用函數fun1
fun1
echo 執行其他語句
echo hello world
空格可以在腳本中突出某些特定地內容。但是要注意,在某些場合就不需要空格
-
變量賦值時不要再賦值運算符等號兩邊使用空格。
進行邏輯判斷,測試命令"[]"的前後都需要使用空格
2 腳本優化
2.1 Shell腳本優化原則
編寫腳本時,使用內置命令,儘量不要使用外置命令。
內置命令:內置Linux系統源碼中的命令,Bash執行這部分命令時,可以不用去磁盤中查找而直接執行,因此執行速度要快於外部命令。
外置命令:使用的時候會先創建新的進程,然後再新的進程中執行命令,這樣就會使CPU和內存資源造成浪費。
在Bash中,可以使用type命令查看命令是否爲內置命令
在必要的情況下,儘量減少“|”(管道)的使用,因爲管道很耗費資源。數據量較多或執行次數較多時,資源消耗會非常明顯。
# 使用管道與不用管道比較
#!/bin/bash
fun1()
{
for ((i=0;i<10000;i++))
do
echo hello wordld | tee -a data.txt
done
}
fun2()
{
for ((i=0;i<10000;i++))
do
echo hello wordld >> data.txt
done
}
echo 記錄函數fun1執行的時間
time fun1
echo
echo 記錄函數fun2執行的時間
time fun2
echo
儘量避免使用管道,使用其他的類似操作來完成,避免使CPU和內存資源造成不必要的浪費。
在進行字符串操作的時候,儘量不要使用awk、sed等高級編輯工具。這些工具需要創建新的進程從而完成字符串的操作。
2.2 提供足夠的提示信息
Shell腳本是交互性很強的腳本語言,在腳本的執行過程中需要進行必要的信息提示。
提示信息不是越多越好,而是在關鍵或重要的地方添加適當的提示性信息即可。
3 腳本使用技巧
3.1 命令選項說明
腳本的編寫依賴於Shell命令。
-a 顯示全部內容
-c 執行計數功能
-d 指定目錄
-e 將內容展開
-f 從指定的文件獲取文件
-h 獲取幫助信息
-r 以遞歸的方式處理目錄文件
-y 設置所有的問題的選項都是yes
-v 獲取命令的版本信息
-i 忽略大小寫
對某些特殊的命令,可以使用man命令先查看如何使用。
3.2 算數運算
在Shell腳本中,所有的變量的默認存儲方式都是字符串,而其操作方式也是按照字符串進行處理的。
要實現數值的算術運算,使用如下方式:
-
let命令
-
(())命令
-
expr表達式
let命令常用於證數的算術運算,還可以使用長的整數運算,支持除++、--和逗號(,)之外的所有整型運算,使用方式如下:
let 算術表達式
let命令的一般形式中,算術表達式的使用方式和C語言中算術表達式的使用方式類似,可以不必使用$來標識變量,bash會自動進行變量數值的計算。
使用let,表達式必須是完整的,並且算術運算符兩邊不允許出現空格或其他的字符
(()) 可以理解爲代替let命令
((算術表達式))
命令(())和let命令相同,使用時,算術表達式可以只有表達式的右邊部分,即表達式的右值。
3.3 高級算數運算
-
bc
bc是Bash中存在的高級運算工具,不但可以實現浮點數的運算,還可以藉助其中的函數實現更加複雜的操作。
使用方式如下
"1.20*3.40"|bc
還可以使用特定的函數實現更高級的處理,
"sqrt(10000)"|bc
數值轉換
"obase=2;10"|bc