shell脚本编程规范

65 阅读5分钟

常见的shell解释器

Linux系统中的Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当一个”命令解释器“的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出结果。 它是用户使用 Linux 的桥梁。

Shell 既是一种命令语言,又是一种程序设计语言。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

查看本机的shell信息:

 [root@localhost ~]# cat /etc/shells
 /bin/sh
 /bin/bash
 /sbin/nologin
 /usr/bin/sh
 /usr/bin/bash
 /usr/sbin/nologin
 /bin/tcsh
 /bin/csh

linux 中常见的shell

  • bash:基于GUN的框架下发展的shell
  • csh:类似C语言的shell
  • tcsh:整合了csh 提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

bash(/bin/bash)是目前大多数 Linux 版本采用的默认 shell。

bash特性:

  1. 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
  2. 支持查看历史命令(history)
  3. 支持别名(alias)
  4. 标准输入和标准输出的重定向
  5. 管道符
  6. 文件名通配机制
  7. 支持命令hash
  8. 支持变量

这些功能都是bash特有的,其他shell环境没有这些功能,或者说没有这么全,所以bash取代sh成为了Linux的默认shell。

脚本的执行方式

1、指定路径去执行文件,文件需要有执行权限。

  • 绝对路径。如:/root/hello.sh
  • 相对路径。如:./hello.sh
 [root@localhost ~]# chmod +x hello.sh
 [root@localhost ~]# /root/hello.sh       //使用绝对路径执行脚本
 hello stars
 [root@localhost ~]# ./hello.sh           //使用相对路径执行脚本
 hello stars

2、指定解释器去执行(bash 脚本名),不需要执行权限。

  • bash 脚本名。如:bash hello.sh
  • “source 脚本名” 或 “ . 脚本名”。 //不会启动子shell环境
 [root@localhost ~]# chmod -x hello.sh
 [root@localhost ~]# ll hello.sh
 -rw-r--r--. 1 root root 31 3月  30 20:27 hello.sh
 [root@localhost ~]# bash hello.sh         //bash执行脚本
 hello stars
 [root@localhost ~]# source hello.sh       //source执行脚本
 hello stars
 [root@localhost ~]# . hello.sh            // . 执行脚本
 hello stars

注意:

  1. 执行脚本时的shell环境:
  • source和 . 执行脚本时,会在当前shell环境中执行脚本。
  • bash、绝对路径、相对路径 执行脚本时,会创建一个子shell环境,并在这个子shell环境中执行脚本。
  1. 不建议使用source来执行脚本,可能会影响一些资源配置。
  2. 脚本中的空白行会被解释器忽略。
  3. 脚本中,除了shebang,余下所有以#开头的行,都回被视作注释行而被忽略。此即为注释行。

脚本错误调试

脚本错误类型:

  1. 命令错误: 命令错误不会影响接下来的命令,之后的命令会继续执行。
  2. 语法错误: 会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。
  3. 逻辑错误: 执行后的效果不是自己想要的。需要自己去排查。

调试方法:

 bash -n 脚本名称     //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
 ​
 bash -x 脚本名称     //显示每个命令的执行过程,方便发现逻辑错误

总结:脚本错误常见的有三种区别

  1. 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
  2. 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
  3. 逻辑错误:只能使用 bash -x 进行

重定向与管道符

由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。

标准输入与输出

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:

类型设备文件文件描述符默认情况对应文件句柄位置
标准输入/dev/stdin0从键盘获得输入/proc/self/fd/0
标准输出/dev/stdout1输出到屏幕(即控制台)/proc/self/fd/1
错误输出/dev/stderr2输出到屏幕(即控制台)/proc/self/fd/2

交互式硬件设备:

  • 标准输入:从该设备接收用户输入数据。

  • 标准输出:通过该设备想用户输出数据。

  • 标准错误:通过该设备报告执行出错信息。

重定向

重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。

1、输入重定向

符号作用
命令 < 文件从指定的文件读取文件,而不是从键盘输入
命令 << 分界符从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2将文件1 作为命令的标准输入并将标准输出到文件2

2、输出重定向

符号作用
命令 > 文件将标准输出结果保存到指定的文件中(覆盖原有内容)
命令 >> 文件将标准输出结果追加到指定的文件尾部
命令 2> 文件将错误输出信息保存到指定文件中(覆盖原有内容)
命令 2>> 文件将错误输出信息追加到指定文件尾部
命令 > 文件 2>&1混合输出,将标准输出与错误输出保存到文同一个文件中
命令 2> 文件 1>&2同上
命令 &> 文件同上
命令 >& 文件同上

注:

  • &表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到同一个文件。
  • 命令 > 文件 2>&1,表示把错误输出2重定向给前面的标准输出1 (前面的1被省略了),即将错误输出和标准输出保存到同一个文件中。

管道符

管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。

linux下的管道符使用"竖杠"表示:| 。

格式:命令A | 命令B