..

bash脚本最佳实践

我经常会记录一些bash脚本的技巧,然后反复的回味他们,今天我将这些技巧记录在blog里面。

  1. 使用完整的命令选择,而是不是简写选项,当你需要反复使用这段脚本的时候,因为他们更加便于阅读和理解。

  2. 使用set -o errexit(set -e)保证你的脚本在出错的时候退出。

  3. 添加 || true 允许命令失败,或者使用|| ;

  4. 使用set -o nounset(set -u)保证你的脚本在使用未定义变量时候自动推出。

  5. 使用set -o xtrace(set -x)来打印执行过程,输出调试信息。

  6. #!/usr/bin/env bash#!/bin/bash更加合适。

  7. 避免使用#!/usr/bin/env bash -e或者(set -e),因为当有人使用bash ./script.sh出错自动退出的功能会失效。

  8. 使用{}来包裹变量,否在放在访问变量的时候可能会引起歧义。

  9. 判断字符串相等的时候,不需要使用两个等于号if [ "name" = "hellojukay"]

  10. 使用:-,当你认为一边变量可能没有定义的时候,if [ "${name:-}" = "hellojukay" ],如果name没有定义,那么name将会被设置为空字符串,你也可以设置以其他的默认值"{name:-hellojukay}"

  11. 定义常量,当前文件名字,当前目录等在脚本的开头几行。

综上所述,你的脚本应该风格类似下面这段脚本。

#!/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:-}"