一. 编程基础
1. 程序组成
程序:算法+数据结构
- 数据:是程序的核心
- 算法:处理数据的方式
- 数据结构:数据在计算机中的类型和组织方式
2.编程风格
2.1 面向过程语言:
-
按照顺序写你的程序
-
问题规模小,可以步骤化,按部就班处理
-
以指令为中心,数据服务于指令
-
C,shell
2.2 面向对象语言:
-
将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能。(不关心内容过程,只关心结果)
-
问题规模大,复杂系统
-
以数据为中心,指令服务于数据
-
java,python,golang.....
3.编程语言
3.1 三种处理逻辑:
-
顺序执行:程序从上到下顺序执行
-
选择执行:程序执行过程中,根据条件不同,进行选择不同分支继续执行
-
循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)
3.2 编程语言的分类
- 编译运行:源代码 → 编译器(编译)→ 程序文件;
- 解释运行:源代码 → 运行时启动解释器,由解释器边解释边运行。
根据启编译过程中功能的实现是调用库还是调用外部的程序文件
- shell脚本编程:利用系统上的命令及编程组件进行编程;
- 完整编程:利用库或编程组件进行编程。
二.shell脚本基础
1.shell脚本应用场景
1.1用途:
-
自动化常用命令
-
执行系统管理和故障排除
-
创建简单的应用程序
-
处理文本或文件
1.2 应用场景:
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
查看本机的shell信息:
linux 中常见的shell
- bash:基于GUN的框架下发展的shell
- nologin:让用户无法登录
bash(/bin/bash)是目前大多数 Linux 版本采用的默认 shell。
bash特性:
- 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
- 支持查看历史命令(history)
- 支持别名(alias)
- 标准输入和标准输出的重定向
- 管道符
- 文件名通配机制
- 支持命令hash
- 支持变量
这些功能都是bash特有的,其他shell环境没有这些功能,或者说没有这么全,所以bash取代sh成为了Linux的默认shell。
三.shell脚本基本结构
3.1 什么是shell脚本:
- 将要执行的命令按顺序一一列出,保存到一个文本文件,最后自动执行。
- 执行脚本需要x权限,也可以使用绝对路径来执行。
- 可结合各种Shell控制语句以完成更复杂的操作。
3.2 脚本的构成:
-
1.开头:#!/bin/bash (脚本解释器)
-
2.以“#”开头的语句表示为注释信息,被注释的语句在脚本运行的时候不会被执行。
-
3.可执行语句:比如echo命令用于输出“ ”之间的字符串
列句
yum本地仓库脚本
3.3 脚本的执行方式
执行脚本方法1:路径执行
[root@localhost ~]# chmod +x hello.sh
[root@localhost ~]# /root/hello.sh //使用绝对路径执行脚本
hello stars
[root@localhost ~]# ./hello.sh //使用相对路径执行脚本
hello stars
执行脚本的方法2:bash + 脚本名称
注意:
- 安装源不同 会产生依赖关系错误,所以建议使用yum history 删除
2 .执行脚本时的shell环境:
- source和 . 执行脚本时,会在当前shell环境中执行脚本。
- bash、绝对路径、相对路径 执行脚本时,会创建一个子shell环境,并在这个子shell环境中执行脚本。
- 不建议使用source来执行脚本,可能会影响一些资源配置。
- 脚本中的空白行会被解释器忽略。
- 脚本中,除了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 |
重定向输出
| 符号 | 作用 |
|---|---|
| 命令 > 文件 | 将标准输出结果保存到指定的文件中(覆盖原有内容) |
| 命令 >> 文件 | 将标准输出结果追加到指定的文件尾部 |
| 命令 2> 文件 | 将错误输出信息保存到指定文件中(覆盖原有内容) |
| 命令 2>> 文件 | 将错误输出信息追加到指定文件尾部 |
| 命令 > 文件 2>&1 | 混合输出,将标准输出与错误输出保存到文同一 |
| 命令 2> 文件 1>&2 | 同上 |
| 命令 &> 文件 | 同上 |
| 命令 >& 文件 | 同上 |
注:
- &表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到同一个文件。
- 命令 > 文件 2>&1,表示把错误输出2重定向给前面的标准输出1 (前面的1被省略了),即将错误输出和标准输出保存到同一个文件中。
示例:
使用分界符进行输入重定向。
标准错误输出
混合模式
多行重定向
- 使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
- HereDocument是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。
EOF
cat
将内容写入 file.txt 文件
修改密码
变量赋值
read a <
echo $a
read i <
echo $i
管道符 |
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
格式:命令A | 命令B
查看opt文件夹并统计行数,单词,字符数
更改密码