作为一名经常接触 Linux 的程序员, Shell 脚本是必备的。
然而诞生于上古世纪的 Shell, 现在已经严重落后于时代, 不得不借助一系列最佳实践,来抵抗其语法方面的脆弱性, 下面是一些总结。
防御式编程,无奈的选择
每一个 Shell 脚本, 其文件头最好加入一些详细的说明:
#!/usr/bin/env bash 指明 Bash
#
# @date: 创建日期
# @author: 作者
# @license: 授权信息
#
# 版权的详细声明
#
# 脚本干嘛用的, 详细说明
set -e 脚本某处出错, 立即退出, 不继续执行
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH PATH变量的设置, 防止子进程找不到命令
执行一个脚本, 老是出错, 但是又找不到原因, 这时候就需要 Debug 了:
$ bash -x $file.bash 这样能展示该文件的详细执行过程
基础语法
变量
var1=value1 = 两边不能有空格
var2=value2
使用变量
"${var1}" 推荐做法, 让你更少出错( 虽然单词更多 )
"${var2}"
数组
arr1=( value1 value2 value3 )
使用数组
# 我也不知道为什么要这样用,但是根据「无法抵抗就好好享受」之定理,咱们先这样用着吧
# 是不是觉得写法特别恶心啊?少年,看你有一双慧眼,不如跟我学......
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. 注意方括号里面的空格 !
核心之函数
function $func() {
}
要点
1. 返回值慎用
2. 函数内的变量使用局部变量定义
3. 括号内没有形参
function my_func() {
local var1=value1
echo "func name: $0"
echo "first parameter: $1"
echo "second parameter: $2"
echo "all parameters: ${[@]}"
}
函数使用
my_func $1 $2
规范的脚本示例
#!/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 * # 这一句处处体现了 Shell 的防御式编程
请个好帮手
Shell 真的是太脆弱了, 不得不请更多大神来帮忙。
这时候 shellcheck
就上场了( 听说是Haskell
写的) , 它是专门检查你的 Shell 脚本的,并且给出规范建议。
使用 shellcheck 之后,幸福感暴增!它就像一个长者,总是默默地在一旁,不厌其烦地指出你的错误,从不来脾气(上了老司机的车,就是爽啊...)。
shellcheck使用:
安装
sudo apt-get install shellcheck
使用
shellcheck $file.bash