【推荐】构建脚本之shell编写规范

本文档总结了编写shell脚本时推荐的代码规范。

1.#!/usr/bin/env bash

指定脚本使用的shell,比较灵活。

2.set -eux

当前shell的执行方式1

-e:脚本运行非0则退出

-u:有不存在的变量则报错

-x:调试脚本,详细的日志输出,免得去echo

3.set -o pipefail

当前shell的执行方式2

表示管道中任何一个命令失败都退出脚本

4.当前脚本包含外部脚本时(不会开启子shell进程):

  (1). filename

  (2)source filename,使shell读入指定的shell程序文件并依次执行文件中的所有语句

  注:source 和 . 不开启子shell,在当前shell中执行,设定的局部变量在执行完命令后仍然有效。

  注:bash 或 sh 或 shell script 执行时,起子shell,其继承父shell的环境变量,子shelll的变量和父shell没联系。

  注:shell 的内件命令exec执行命令时,不启用子shell进程,用被执行的命令行替换掉当前的shell进程。

    

例如在当前shell中执行 exec pwd 表示用pwd替换当前shell进程 ,即为执行完后会退出当前shell。

可以将exec命令放到一个shell脚本中,用主脚本调用这个脚本,调用处用bash  xx.sh(xx.sh为存放exec命令的脚本),这样会为xx.sh建立一个子shell去执行,当执行exec后该子脚本进程就被替换成相应的exec的命令。

5.查找并删除进程

ps -ef |grep 'mysql' |grep -v grep |awk '{print $2}' |xargs kill -9

6.[]里面如果有变量,给其使用双引号

[-f $filename]改为[-f "$filename"]

7.变量

  (1)环境变量大写=>NAME

  (2)自定义变量小写=>name

  (3)特殊变量,通过命令行传递参数进行计算,$0代表脚本名字

  (4)exec "$@" =>执行传进来的所有参数,此命令会替代子she进程。

  (5)if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi =>$()和反引号用来引用命令,得到的是命令的执行结果

原文地址:https://www.cnblogs.com/frantz/p/13563549.html