shel脚本编程基础与脚本规范

137 阅读7分钟

一. 编程基础

1. 程序组成

程序:算法+数据结构

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

2.编程风格

2.1 面向过程语言:

  • 按照顺序写你的程序

  • 问题规模小,可以步骤化,按部就班处理

  • 以指令为中心,数据服务于指令

  • C,shell

2.2 面向对象语言:

  • 将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能。(不关心内容过程,只关心结果)

  • 问题规模大,复杂系统

  • 以数据为中心,指令服务于数据

  • java,python,golang.....

3.编程语言

3.1 三种处理逻辑:

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

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

  • 循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)

3.2 编程语言的分类

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

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

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

二.shell脚本基础

1.shell脚本应用场景

1.1用途:

  1. 自动化常用命令

  2. 执行系统管理和故障排除

  3. 创建简单的应用程序

  4. 处理文本或文件

1.2 应用场景:

  1. 重复性操作
  2. 交互性任务
  3. 批量事务处理
  4. 服务运行状态监控
  5. 定时任务执行

查看本机的shell信息:

image.png

linux 中常见的shell

  • bash:基于GUN的框架下发展的shell
  • 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。

三.shell脚本基本结构

3.1 什么是shell脚本:

  • 将要执行的命令按顺序一一列出,保存到一个文本文件,最后自动执行。
  • 执行脚本需要x权限,也可以使用绝对路径来执行。
  • 可结合各种Shell控制语句以完成更复杂的操作。

3.2 脚本的构成:

  • 1.开头:#!/bin/bash (脚本解释器)

  • 2.以“#”开头的语句表示为注释信息,被注释的语句在脚本运行的时候不会被执行。

  • 3.可执行语句:比如echo命令用于输出“ ”之间的字符串

列句

image.png

yum本地仓库脚本

image.png

3.3 脚本的执行方式

执行脚本方法1:路径执行

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

image.png

执行脚本的方法2:bash + 脚本名称

image.png

注意:

  1. 安装源不同 会产生依赖关系错误,所以建议使用yum history 删除

2 .执行脚本时的shell环境:

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

四.脚本错误调试

4.1 > > 调试方法

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

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

4.2 脚本错误类型:

  • 1.命令错误:命令出错不会影响,接下来的命令继续

可以用bash -n 检查错误,提示的出错行数不一定是准确的

  • 2.语法错误:语法错误会影响接下来的命令继续

用bash -n 无法检查出来 ,可以使用 bash -x 进行观察

  • 3.逻辑错误:自己删查

只能使用 bash -x 进行

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

五.重定向与管道符

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

5.1标准输入与输出

标准输入:

 文件设备:/dev/stdin  
 文件描述编号:0
  默认设备:键盘
  对应文件句柄位置:/proc/self/fd/0

标准输出:

 文件设备:/dev/stdout  
 文件描述编号:1
  默认设备:显示器
   对应文件句柄位置:/proc/self/fd/1

标准错误输出:

 文件设备:/dev/stderr 
 文件描述编号:2
  默认设备:显示器
   对应文件句柄位置:/proc/self/fd/2

交互式硬件设备:

  • - 标准输入:用户向该设备输入信息

  • - 标准输出:该设备向用户输出数据

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

5.2重定向

不通过标准输出到屏幕上,输出到你指定的位置

5.3重定向使用类型,操作符

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

重定向输入

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

image.png

重定向输出

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

注:

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

示例:

image.png

使用分界符进行输入重定向。

image.png

标准错误输出

image.png

混合模式

image.png

多行重定向

  • 使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
  • HereDocument是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。

EOF

image.png

cat

image.png

将内容写入 file.txt 文件

image.png

修改密码

image.png

变量赋值

read a <

echo $a

image.png

read i <

echo $i

image.png

管道符 |

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

格式:命令A | 命令B

查看opt文件夹并统计行数,单词,字符数

image.png

更改密码

image.png

image.png

image.png