编程基础
程序组成
程序:算法+数据结构
- 数据:是程序的核心
- 算法:处理数据的方式
- 数据结构:数据在计算机中的类型和组织方式
三种处理逻辑
顺序执行:程序按从上到下顺序执行
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
循环执行:程序执行过程中需要重复执行多次某段语句
编程语言的分类
根据运行方式
- 编译运行:源代码 → 编译器(编译)→ 程序文件;
- 解释运行:源代码 → 运行时启动解释器,由解释器边解释边运行。
根据启编译过程中功能的实现是调用库还是调用外部的程序文件
- 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
linux中常见的shell
- bash:基于gun的框架下发展的shell
- csh:类似c语言的shell
- tcsh:整合了csh提供了更多功能
- sh:已经被bash替换
- nologin:让用户无法登录
bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
bash特性:
- 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
- 支持查看历史命令(history)
- 支持别名(alias)
- 标准输入和标准输出的重定向
- 管道符
- 文件名通配机制
- 支持命令hash
- 支持变量
shell脚本构成
什么是shell脚本
- 就是将命令按顺序一一列出,最后自动执行
- 执行需要权限,也可以直接使用绝对路径
- 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本
shell脚本的构成
- 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器
- 注释信息:以#开头的语句表示为注释信息
- 可执行语句:比如echo命令用于输出“ ”之间的字符串
脚本的名称规范
文件名以 .sh 结尾
脚本代码开头约定:
- 第一行一般为调用使用的语言
- 程序名,避免更改文件名后无法找到正确的文件
- 版本号
- 更改后的时间
- 作者相关信息
- 该程序的作用,及注意事项
- 最后是各版本的更新简要说明
脚本的执行方式
指定路径去执行文件,文件需要有执行权限。
- 绝对路径。如:/root/hello.sh
- 相对路径。如:./hello.sh
指定解释器去执行(bash 脚本名),不需要执行权限。
- bash 脚本名。如:bash hello.sh
- “source 脚本名” 或 “ . 脚本名”。 //不会启动子shell环境
脚本错误调试
脚本错误类型
命令错误: 命令错误不会影响接下来的命令,之后的命令会继续执行。
语法错误: 会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。
逻辑错误: 执行后的效果不是自己想要的。需要自己去排查。
查询代码是否正确:
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 逻辑错误
脚本错误常见的有三种区别
- 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
- 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
- 逻辑错误:只能使用 bash -x 进行
重定向与管道符
标准输入与输出
| 类型 | 设备文件 | 文件描述编号 | 默认设备 | 对应文件句柄位置 |
|---|---|---|---|---|
| 标准输入 | /dev/stdin | 0 | 键盘 | /proc/self/fd/0 |
| 标准输出 | /dev/stdout | 1 | 显示器 | /proc/self/fd/1 |
| 标准错误输出 | /dev/stderr | 2 | 显示器 | /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
管道符
管道符的作用是连接两个命令,将第一个命令的标准输出作为第二个命令的标准输入。 同一行命令中可以使用多个管道符。
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