系列文章目录
` 提示:仅用于个人学习,进行查漏补缺使用。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- 前言
- Shell脚本概述
- Shell脚本的概念
- Shell环境
- Shell脚本应用场景
- Shell的作用
- Shell编程规范
- Shell脚本运行方法
- 子shell的概念(shell列表的理念)
- 二、Shell脚本变量
前言
本章大概内容有:
Shell脚本概述、环境、应用场景、作用、编程规范、脚本运行方法、子Shell概念、脚本变量等
提示:以下是本篇文章正文内容,下面案例可供参考
Shell脚本概述
- Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell脚本是一种命令解析器,是在Unix-like操作系统中用来批量处理任务的脚本程序。它通常由一系列命令组成,这些命令会被Shell一一执行。
- Shell脚本可以用来自动化日常任务,编写系统管理脚本,甚至是开发复杂的应用程序。
- Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
- Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
Shell环境
- 检查一下/etc/shells这个文件,里面就是Linux所包含的Shell。
常见的Shell环境 | 描述 |
---|---|
Bourne Shell (/bin/sh) | Unix的默认Shell,提供基本的命令行界面和执行功能。 |
Bash | Bourne Shell的扩展,提供了更多的功能和特性,如数组和循环。 |
C Shell (csh) | 基于Bourne Shell,增加了类C语言的语法和功能。 |
Korn Shell (ksh) | 结合了Bourne Shell和C Shell的特点,提供了脚本编程的增强特性。 |
Z Shell (zsh) | 功能强大的Shell环境,提供了自动补全、语法高亮等特性。 |
Tcsh | C Shell的扩展,增加了命令历史和补全功能。 |
Dash | Debian Almquist Shell,是Bourne Shell的一个轻量级实现,性能更优。 |
Fish | 用户友好的Shell环境,提供了自动补全和语法高亮等特性。 |
- _PS: _
- 在一般情况下,并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
- #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- …
Shell的作用
序号 | 应用场景 | 描述 |
---|---|---|
1 | 自动化任务执行 | Shell脚本可以将一系列命令组合起来,减少重复性工作,提高工作效率。 |
2 | 任务调度 | Shell脚本可以用来设置定时任务,如每天、每周或每月自动执行某些操作。 |
3 | 数据处理 | Shell脚本可以处理文件和数据,如数据排序、查找、替换等。 |
4 | 系统管理 | Shell脚本可以用来管理系统的各个方面,如用户管理、文件系统管理、网络配置等。 |
5 | 程序开发 | Shell脚本可以用来开发简单的程序,尤其是那些需要与操作系统紧密集成的程序。 |
6 | 测试 | Shell脚本可以用来编写单元测试和集成测试,以确保软件的质量和稳定性。 |
7 | 日志分析 | Shell脚本可以用来分析系统日志文件,帮助系统管理员诊断和解决问题。 |
8 | 数据备份和恢复 | Shell脚本可以用来自动化数据备份和恢复过程,确保数据的安全性。 |
9 | 软件和配置 | Shell脚本可以用来自动化软件的安装过程,简化复杂的配置任务。 |
10 | 定制化系统功能 | Shell脚本可以根据特定需求定制化系统的某些功能,如自动发送报告、邮件提醒等。 |
Shell编程规范
规范类别 | 具体规范 |
---|---|
文件命名 | - 遵循Linux命名规则 - 使用字母、数字和下划线 - 以字母或下划线开头 - 避免使用保留字 |
脚本结构 | - 声明解释器 - 赋予执行权限 - 采用缩进和空行 |
注释 | - 使用# 进行单行注释- 放置版权信息和元数据 |
变量使用 | - 定义变量使用my_variable="value" - 变量命名具有描述性 - 使用 echo 打印变量值 |
控制结构 | - 一致的缩进风格 - 正确无误的条件判断和循环逻辑 |
错误处理 | - 使用set -e 停止错误执行- 使用 set -o pipefail 处理管道错误- 检查命令退出状态 |
资源管理 | - 使用exit 或return 结束脚本- 使用 trap 处理信号 |
代码复用 | - 使用函数封装代码块 - 通过函数参数传递数据,避免全局变量 |
避免危险操作 | - 避免安全风险命令或操作 - 使用 set -u 避免未定义变量 |
性能优化 | - 优化逻辑,减少资源消耗 - 使用缓存和临时文件提高性能 |
测试与验证 | - 进行单元测试 - 使用检查列表验证执行结果 |
Shell脚本运行方法
- 写一个shell脚本,创建一个test文件夹,在该文件夹vi写一个test.sh文件(扩展名sh代表shell脚本文件),编辑如下:
#!/bin/bash ### #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo "Hello World !" ### echo 命令用于向窗口输出文本。
- 1. 作为可执行程序,但要求文件必须有x(可执行)权限
- 当前路径/脚本程序
[root@server test]# chmod +x /test/test.sh
[root@server test]# ./test.sh
Hello World !
- 绝对路径/脚本程序
[root@server test]# pwd
/test
[root@server test]# /test/test.sh
Hello World !
-
**PS: **
- 如果直接写 test.sh,linux 系统会去** PATH** 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在** PATH** 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 或/test.test.sh 告诉系统在哪里找到脚本运行。
-
2.作为解释器参数
- 直接运行解释器,其参数就是shell脚本的文件名,不要求文件必须有 x 权限。
/bin/sh test.sh
-
PS:
- 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
-
_3.source命令 _
- source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令
- source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
- linux所有的操作都会变成文件的格式存在。
[root@server test]# source /test/test.sh
Hello World !
- 补充
- “source filename”与“sh filename”、“./filename”这三个命令都可以用于执行一个脚本文件,那么它们之间的区别又如何呢:
- (1)当shell脚本具有可执行权限时,用sh filename与./filename是没有区别的。./filename是因为当前目录没有在PATH中,所以"."是用来表示当前目录的。
- (2)sh会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell,除非使用export。
- ps -ef --forest 查看一个进程的父子进程关系
- bash 会产生一个子shell,如进程关系,如shell脚本的/bin/bash,会产生一个子shell进程
- “source filename”与“sh filename”、“./filename”这三个命令都可以用于执行一个脚本文件,那么它们之间的区别又如何呢:
子shell的概念(shell列表的理念)
- **目的:**多进程并行处理任务
- 小括号()表示开启子shell列表,小括号中引用的命令表示嵌套子shell
(echo $BASH_SUBSHELL) ###查看当前子shell个数
- 示例:
(ls;echo $BASH_SUBSHELL)也可以嵌套执行:
(ls(echo $BASH_SUBSHELL))
(ls(pwd(echo $BASH_SUBSHELL)))
以上操作为并行多进程处理任务
二、Shell脚本变量
在Shell脚本编程中,变量用来存储和使用数据。按照其特性和用途,Shell变量主要可以分为以下几类:
- **环境变量:**这些变量对于Shell来说是有特殊意义的,它们影响Shell的行为以及运行的程序。环境变量可以被Shell的任何子进程继承。
- **位置变量:**这些变量由命令行参数提供,它们分别对应于脚本接收的参数。
- **局部变量:**在函数中定义的变量,只在该函数的作用域内有效。
- **全局变量:**在脚本中定义的变量,在整个脚本的作用域内有效。
- **特殊变量:**这些变量由Shell本身定义,有特殊的功能。
下面是一个整理成表格的变量类型详解:
变量类型 | 描述 | 示例 | 用途 |
---|---|---|---|
环境变量 | 为程序的运行提供环境信息,被Shell及其子进程继承 | export VAR="value" | 设置环境参数,影响程序行为 |
位置变量 | 接收命令行输入的参数 | $1 , $2 等 | 获取脚本参数 |
局部变量 | 函数内部定义,仅在函数内部有效 | local localVar="value" | 函数内部使用,避免全局污染 |
全局变量 | 脚本范围内定义,整个脚本中有效 | VAR="value" | 跨函数使用变量 |
特殊变量 | Shell内置,有特殊含义或功能 | $$ , $? , $! 等 | 执行控制、状态查询等 |
特殊变量举例说明:
$$
:当前Shell进程ID(PID)$?
:最后命令的退出状态$!
:最后一个后台命令的进程ID