ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] > [阮一峰的参考](https://wangdoc.com/bash/grammar.html#-n%E5%8F%82%E6%95%B0) > [google shell 规范](https://google.github.io/styleguide/shellguide.html) ## 通用模板 ``` #!/bin/bash # # 描述文件内容 set -euo pipefail ### ### my-script — does one thing well ### ### Usage: ### my-script <input> <output> ### ### Options: ### <input> Input file to read. ### <output> Output file to write. Use '-' for stdout. ### -h Show this message. help() { sed -rn 's/^### ?//;T;p' "$0" } # 没有参数,或参数为 -h if [[ $# == 0 ]] || [[ "$1" == "-h" ]]; then help exit 1 fi ####################################### # Delete a file in a sophisticated manner. # Arguments: # File to delete, a path. # Returns: # 0 if thing was deleted, non-zero on error. ####################################### function del_thing() { rm "$1" } # 所有错误消息都应转到STDERR err() { echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2 } if ! do_something; then err "Unable to do_something" exit 1 fi # 推荐从main 开始 main() { func1() func2() } ``` ## 使用文件之前判断是否存在,并进行异常处理 ``` # 判断普通文件存在 if [[ ! -f 'a.txt' ]]; then touch 'a.txt' fi # 判断文件夹存在 if [[ ! -d 'src' ]]; then echo 'src dir not found' exit 1 fi ``` ## 条件判断 `[[...]]` 优于 `[...]` ``` if [[ "filename" == "f*" ]]; then echo "Match" fi ``` ## 函数内部使用局部变量 变量默认为全局,在函数中推荐使用局部变量 ``` fn () { local foo foo=1 } ``` ## 使用 $() 而不是 反引号 ## 使用 /dev/null 过滤输出信息 `[expr] > /dev/null 2>&1` 命令解释:重定向到空设备,并把标准错误输出stderr也重定向为stdout。 注意, 2>&1 应该总是放在命令的末尾。 ## 文件名的通配符扩展 `./*` 优于 `*` 由于文件名可以以"-"开头,所以用`./*`代替`*`来扩展通配符要安全得多 ``` bad rm -v * good rm -v ./* ``` ## 目录不存在问题 ``` // bad cd $dir_name rm * //如果目录则会删除用户下的文件 // good [[ -d $dir_name ]] && cd $dir_name && rm * ``` ## 命名空间 命名空间只是语义化的函数名,`function`可省略 ``` # Single function my_func() { … } # Part of a package,更加语义化的函数名 mypackage::my_func() { … } ```