Shell脚本基础与基本规范

85 阅读6分钟

编程基础

程序组成

程序:算法+数据结构

  • 数据:是程序的核心
  • 算法:处理数据的方式
  • 数据结构:数据在计算机中的类型和组织方式

三种处理逻辑

顺序执行:程序按从上到下顺序执行

选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

循环执行:程序执行过程中需要重复执行多次某段语句

编程语言的分类

根据运行方式

  • 编译运行:源代码 → 编译器(编译)→ 程序文件;
  • 解释运行:源代码 → 运行时启动解释器,由解释器边解释边运行。

根据启编译过程中功能的实现是调用库还是调用外部的程序文件

  • shell脚本编程:利用系统上的命令及编程组件进行编程;
  • 完整编程:利用库或编程组件进行编程。

Shell脚本基础

Shell脚本的作用和应用场景

作用:

  • 自动化常用命令
  • 执行系统管理和故障排除
  • 创建简单的应用程序
  • 处理文本或文件

应用场景:

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

常见的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

image.png

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. 支持变量

shell脚本构成

什么是shell脚本

  • 就是将命令按顺序一一列出,最后自动执行
  • 执行需要权限,也可以直接使用绝对路径
  • 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本

shell脚本的构成

  1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器
  2. 注释信息:以#开头的语句表示为注释信息
  3. 可执行语句:比如echo命令用于输出“ ”之间的字符串

脚本的名称规范

文件名以 .sh 结尾

脚本代码开头约定:

  1. 第一行一般为调用使用的语言
  2. 程序名,避免更改文件名后无法找到正确的文件
  3. 版本号
  4. 更改后的时间
  5. 作者相关信息
  6. 该程序的作用,及注意事项
  7. 最后是各版本的更新简要说明

脚本的执行方式

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

  • 绝对路径。如:/root/hello.sh
  • 相对路径。如:./hello.sh

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

  • bash 脚本名。如:bash hello.sh
  • “source 脚本名” 或 “ . 脚本名”。 //不会启动子shell环境

脚本错误调试

脚本错误类型

命令错误:  命令错误不会影响接下来的命令,之后的命令会继续执行。

语法错误:  会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。

逻辑错误:  执行后的效果不是自己想要的。需要自己去排查。

查询代码是否正确:

bash -n 脚本名称 (不在当前目录下加绝对路径)     检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径)     逻辑错误

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

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

重定向与管道符

标准输入与输出

类型设备文件文件描述编号默认设备对应文件句柄位置
标准输入/dev/stdin0键盘/proc/self/fd/0
标准输出/dev/stdout1显示器/proc/self/fd/1
标准错误输出/dev/stderr2显示器/proc/self/fd/2

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

重定向

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

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中

注:

  • &表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到同一个文件。
  • 命令 > 文件 2>&1,表示把错误输出2重定向给前面的标准输出1 (前面的1被省略了),即将错误输出和标准输出保存到同一个文件中。
[root@localhost ~]# km
bash: km: 未找到命令...
[root@localhost ~]# km 2> 2.txt
[root@localhost ~]# cat 2.txt
bash: km: 未找到命令...
[root@localhost ~]# echo "123456" > 3.txt
[root@localhost ~]# cat 3.txt
123456

[root@localhost ~]# echo "abc" >> 3.txt
[root@localhost ~]# cat 3.txt
123456
abc

image.png

管道符

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

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

格式:

命令A | 命令B

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 193700  6836 ?        Ss   11:17   0:00 /usr/lib/systemd/systemd --switched-root --syst
root          2  0.0  0.0      0     0 ?        S    11:17   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    11:17   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   11:17   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    11:17   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    11:17   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    11:17   0:00 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S    11:17   0:00 [watchdog/0]
root         11  0.0  0.0      0     0 ?        S    11:17   0:00 [watchdog/1]
....................................


[root@localhost ~]# ps aux | wc -l
157