..
bash脚本最佳实践
我经常会记录一些bash脚本的技巧,然后反复的回味他们,今天我将这些技巧记录在blog里面。
-
使用完整的命令选择,而是不是简写选项,当你需要反复使用这段脚本的时候,因为他们更加便于阅读和理解。
-
使用
set -o errexit
(set -e)保证你的脚本在出错的时候退出。 -
添加
|| true
允许命令失败,或者使用|| ;
。 -
使用
set -o nounset
(set -u)保证你的脚本在使用未定义变量时候自动推出。 -
使用
set -o xtrace
(set -x)来打印执行过程,输出调试信息。 -
#!/usr/bin/env bash
比#!/bin/bash
更加合适。 -
避免使用
#!/usr/bin/env bash -e
或者(set -e),因为当有人使用bash ./script.sh
出错自动退出的功能会失效。 -
使用{}来包裹变量,否在放在访问变量的时候可能会引起歧义。
-
判断字符串相等的时候,不需要使用两个等于号
if [ "name" = "hellojukay"]
。 -
使用
:-
,当你认为一边变量可能没有定义的时候,if [ "${name:-}" = "hellojukay" ]
,如果name没有定义,那么name将会被设置为空字符串,你也可以设置以其他的默认值"{name:-hellojukay}" -
定义常量,当前文件名字,当前目录等在脚本的开头几行。
综上所述,你的脚本应该风格类似下面这段脚本。
#!/usr/bin/env bash
# Bash3 Boilerplate. Copyright (c) 2014, kvz.io
set -o errexit
set -o pipefail
set -o nounset
# set -o xtrace
# Set magic variables for current file & dir
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
__file="${__dir}/$(basename "${BASH_SOURCE[0]}")"
__base="$(basename ${__file} .sh)"
__root="$(cd "$(dirname "${__dir}")" && pwd)" # <-- change this as it depends on your app
arg1="${1:-}"