shell脚本编程规范
shell脚本概述
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
-
什么是Shell
就是与内核沟通的界面、应用程序等等。比如你要播放音乐,你的计算机通过你在shell输入的打开音乐的命令,Shell在告诉操作系统的内核用户希望打开音乐,内核在通过cpu调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者. -
Shell(壳程序)
是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命今) 并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。 -
Linux中有哪些shell
检查一下/etc/shells这个文件,里面就是Linux所包含的shell。
最常用的就是bash、tcsh、csh、sh、nologin这些shell。这些shell都是依据Linux发展者的不同所创造出的不同版本
1 bash: 基准于GNU的框架下发展出的shell。
2 csh: 语法有点类似于c语言的shell。
3 tcsh: 整合了csh,提供更多的功能。
4 sh: 已经被bash所替换
5 nologin: 奇怪的shell,这个shell可以让用户无法登录主机
注: bash (/bin/bash) 是目前大多数 Linux 版本采用的默认 Shell。
-
拓展知识:
1 为什么系统上合法的shell要写入/etc/shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件
2 用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内
shell脚本的作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
shell是一个面向字符串的编程语言,可以跟python之类的其他语言配合起来,比如某个复杂的功能使用一个Python脚本来实现,然后在shell中调用这个脚本实现较复杂的功能;或者反过来,在Python脚本中调用外部的Shell脚本来提高自动化的效率,也是可以的。
计算机编程语言 | |
---|---|
面向对象 | java ,python,C++,C#,Go |
面向过程 | C语言,shell |
强类型语言 | JAVA , C ,C++ ,C# , GO |
弱类型语言 | python, Shell , PHP |
编译型语言,执行前需要先编译,运行速度快 | JAVA , C ,C++ ,C# , GO |
解释性语言,不需要编译即可直接执行,常用于作脚本 | python, Shell , PHP |
编写shell脚本的规范
- 1)脚本声明 若第一行为"#!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
- 2)注释信息 行首以#号开头定义注释信息,被注释的行内容将不会被执行
- 3)可执行语句 编写要执行的脚本代码;比如echo命令,用于输出""之间的字符串
运行shell脚本
- 1)用绝对路径或者相对路径指定脚本文件运行,需要执行用户拥有执行权限x,脚本会在子shell环境中运行(不会影响当前所在目录、变量的值 等因素)
- 2)用 bash或者sh 程序指定脚本文件运行,不需要执行权限,脚本会在子shell环境中运行(不会影响当前所在目录、变量的值 等因素)
- 3)用 source或者. 号指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值 等因素)
重定向与管道操作
交互式硬件设备
- 标准输入: 从该设备接收用户输入的数据
- 标准输出: 通过该设备向用户输出数据
- 标准错误: 通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件 (覆盖原有内容) |
重定向输出 | >> | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息保存到指定的文件 (覆盖原有内容 |
标准错误输出 | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
混合输出 | 2>&1 | 将标准错误输出重定向到标准输出 |
- 重定向输入和重定向输出
- 标准错误输出
- 混合输出
ls -lh xlog.txt 2>&1等同于ls -lh &> log.txt
本来1–>屏幕(1指向屏幕)
执行>log.txt后,1–>log.txt (1指向loq.txt)
执行2>&1后,2–>1 (2指向1,而1指向log.txt,因此2也指向了log.txt)
管道符号“|”
将左侧命令输出的结果,作为右侧命令的处理对象
注意,有的右侧命令不能处理左侧的输出结果,这里要在“|”后面加上xargs
示例:find /opt -name “*.txt” | xargs ls -lh
shell脚本变量
- 变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值: 能够根据用户设置、系统环境的变化而变化 - 变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量: 环境变量,只读变量,位置变量,预定义变量
定义一个新的变量
- 定义一个新的变量
变量名必须以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
- 查看变量的值
echo $变量名
通常来说,建议平时就一直加上“”号,省的到时候报错
赋值时使用引号
- 双引号": 允许通过$符号引用其他变量值
- 单引号 ': 禁止引用其他变量值,$视为普通字符
- 反撇号`: 命令替换,提取命令执行后的输出结果(反撇号在键盘左上位置,在tab键上面)相当于$()
- 从键盘输入内容为变量赋值
read [-p“提示信息”] 变量名
先vim second.sh
设置变量的作用范围
export 变量名-----临时有效,重启失效
- 永久生效
vim /etc/profile
整数变量的运算
- 1
expr 变量1 运算符 变量2 [运算符] [变量3]
常用运算符
常用运算符 | |
---|---|
加法运算 | + |
减法运算 | - |
乘法运算 | \ * |
除法运算 | / |
求模 (取余) 运算 | % |
- 2
echo $(( ))-----括号里面可以加空格也可不加
- 3
echo $[ ] -----中括号里面可以加空格也可不加
- 4 let 设置一个变量,然后echo输出
let i=10*3
echo $i
拓展
特殊的ShelI变量
- 环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、~/.bash_profile - 常见的环境变量
PWD、PATH
USER 、SHELL、HOME
如何把命令加入到环境变量中
- 方法一:复制命令文件内容到环境变量的配置文件目录中
- 方法二:将命令文件所在的目录加入到环境变量配置目录
vim /etc/profile
设置只读变量(用于变量值不允许被修改的情况,包括删除或取消,想删除重启)
readonly 变量名
位置变量
表示为$n,
vim /root/third.sh
预定义变量
$ * 、$ @: 表示命令或脚本要处理的参数。
$ * :把所有参数着成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4。
$ @: 把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1”“$2””“$3"”$4”。
$0: 表示当前执行的脚本或命令的名称。
$#: 表示命今或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。