作為一名經(jīng)常接觸 Linux 的程序員, Shell 腳本是必備的。
然而誕生于上古世紀(jì)的 Shell, 現(xiàn)在已經(jīng)嚴(yán)重落后于時代, 不得不借助一系列最佳實踐,來抵抗其語法方面的脆弱性, 下面是一些總結(jié)。
防御式編程,無奈的選擇
每一個 Shell 腳本, 其文件頭最好加入一些詳細(xì)的說明:
#!/usr/bin/env bash 指明 Bash
#
# @date: 創(chuàng)建日期
# @author: 作者
# @license: 授權(quán)信息
#
# 版權(quán)的詳細(xì)聲明
#
# 腳本干嘛用的, 詳細(xì)說明
set -e 腳本某處出錯, 立即退出, 不繼續(xù)執(zhí)行
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH PATH變量的設(shè)置, 防止子進(jìn)程找不到命令
執(zhí)行一個腳本, 老是出錯, 但是又找不到原因, 這時候就需要 Debug 了:
$ bash -x $file.bash 這樣能展示該文件的詳細(xì)執(zhí)行過程
基礎(chǔ)語法
變量
var1=value1 = 兩邊不能有空格
var2=value2
使用變量
"${var1}" 推薦做法, 讓你更少出錯( 雖然單詞更多 )
"${var2}"
數(shù)組
arr1=( value1 value2 value3 )
使用數(shù)組
# 我也不知道為什么要這樣用,但是根據(jù)「無法抵抗就好好享受」之定理,咱們先這樣用著吧
# 是不是覺得寫法特別惡心?。可倌?,看你有一雙慧眼,不如跟我學(xué)......
for val in "${arr1[@]}"; do
done
流程控制
if [ $condition ]; then
$statements
elif [ $condition ]; then
$statements
else
$statements
fi
for $var in $array; do
$statements
done
for (( i=0; i < 10; i++)); do
$statements
done
while [ $condition ]; do
$statements
done
until [ $condition ]; do
$statements
done
case $var in
$first)
$action ;;
$second)
$action ;;
$third)
$action ;;
*)
$action ;;
esac
要點:
1. 注意方括號里面的空格 !
核心之函數(shù)
function $func() {
}
要點
1. 返回值慎用
2. 函數(shù)內(nèi)的變量使用局部變量定義
3. 括號內(nèi)沒有形參
function my_func() {
local var1=value1
echo "func name: $0"
echo "first parameter: $1"
echo "second parameter: $2"
echo "all parameters: ${[@]}"
}
函數(shù)使用
my_func $1 $2
規(guī)范的腳本示例
#!/usr/bin/env bash
#
# @date: 2016/11/11
# @author: he.zhiming
# @license: BSD
#
# Use BSD License
#
# Example shell script, for test.
set -e
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
var1="value1"
var2="value2"
arr1=( "val1" "val2" "val3" )
if [ -e "${var1}" ] || [ -e "${var2}" ]; then
echo "${var1}"
elif [ -e "${var2}" ] && [-e "${var1}" ]; then
echo "${var2}"
else
echo "nothing"
fi
for val in "${arr1[@]}"; then
echo ${val}
done
while [ "" == "" ]; then
echo "${var1} == ${var2}"
done
[[ -d "$dirname" ]] && cd $dirname && rm * # 這一句處處體現(xiàn)了 Shell 的防御式編程
請個好幫手
Shell 真的是太脆弱了, 不得不請更多大神來幫忙。
這時候 shellcheck 就上場了( 聽說是Haskell 寫的) , 它是專門檢查你的 Shell 腳本的,并且給出規(guī)范建議。
使用 shellcheck 之后,幸福感暴增!它就像一個長者,總是默默地在一旁,不厭其煩地指出你的錯誤,從不來脾氣(上了老司機(jī)的車,就是爽啊...)。
shellcheck使用:
安裝
sudo apt-get install shellcheck
使用
shellcheck $file.bash