目录
一、shell脚本
1、shell脚本概述
2、shell脚本的应用场景
3、shell脚本的作用——命令解释器
二、Shell 脚本编程规范
1、用户登录Shell
2、shell脚本的构成
3、执行shell脚本
三、重定向与管道操作
1、重定向
1.1、交互式硬件设备
1.2、重定向操作
2、重定向输入
3、重定向输出
4、错误重定向
4.1、错误重定向作用
5、管道操作
四、Shell脚本变量及赋值
1、shell的变量
2、Shell变量的作用
3、自定义变量
3.1、定义一个新变量
3.2、echo——查看变量
4、变量特殊的赋值操作
4.1、单引号
4.2、双引号
4.3、反撇号
5、交互式定义变量
5.1、read命令
5.2、read——常用参数
6、变量的作用范围
6.1、export命令
五、数值变量的运算及特殊变量
1、expr命令
1.1、常量的运算
1.2、变量的运算
2、特殊的shell变量
2.1、环境变量
2.2、常见的环境变量
2.2.1、PATH 变量
2.2.2、只读变量
2.2.3、位置变量
2.2.4、预定义变量
一、shell脚本
1、shell脚本概述
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
2、shell脚本的应用场景
①、重复性操作
在处理需要重复执行的任务时,Shell脚本是非常有效的工具。通过编写脚本,可以将日常的重复性操作自动化,如文件备份、数据清洗、日志分析等,减少人为操作的错误,提高工作效率。这种自动化脚本不仅节省了时间,还保证了任务执行的一致性和可靠性。
②、交互性任务
Shell脚本可以用于处理需要用户交互的任务。例如,安装和配置软件时,脚本可以提示用户输入必要的信息,进行相应的设置操作。通过交互式脚本,用户可以方便地根据提示完成复杂的配置任务,避免手动输入命令的繁琐过程,提高操作的便捷性。
③、批量事务处理
在需要处理大量事务的情况下,Shell脚本可以批量执行任务,大大提高效率。例如,批量创建用户、批量处理文件、批量执行数据库操作等。通过脚本,可以一次性完成大量重复性工作,避免手工操作的繁琐和错误,提升工作效率和准确性。
④、服务运行状态监控
Shell脚本可以用于监控系统和服务的运行状态,及时发现并处理异常情况。例如,监控服务器的CPU、内存、磁盘使用情况,检查服务是否正常运行,并在异常时发送报警通知。通过脚本的自动化监控,可以及时发现问题,保证系统和服务的稳定运行。
⑤、定时任务执行
利用Shell脚本可以轻松实现定时任务的自动化执行。通过与cron等定时任务管理工具结合,脚本可以在指定的时间自动执行特定任务,如定时备份数据库、定期清理日志文件、定时更新系统等。这种自动化的定时任务执行方式,确保了任务的准时和一致性,减少了人工干预。
3、shell脚本的作用——命令解释器
Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
二、Shell 脚本编程规范
1、用户登录Shell
通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
- /bin/sh #是bash命令的软链接 (已经被/bin/bash所替换)
- /bin/bash #基准于GNU的框架下发展出的Shell。
- /usr/bin/sh #已经被bash所替换。
- /usr/bin/bash #centos和redhat系统默认使用bash shell
- /bin/tcsh #csh的增强版,与csh完全兼容 整合了csh,提供更多的功能。
- /bin/csh #已经被/bin/bash 所替换 (整合C shell,提供更多的功能)
2、shell脚本的构成
- shell脚本:若第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
- 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
- 可执行语句:如echo命令,用于输出“ ”之间的字符串
3、执行shell脚本
- 编写脚本
[root@localhost ~]# vim first.sh //新建first.sh脚本文件
#!/bin/bash
cd /opt/
pwd
ls -lh c*
echo "hello world"
- 添加执行权限
[root@localhost opt]# chmod +x first.sh //添加权限
- 执行脚本
[root@localhost opt]# sh first.sh
[root@localhost opt]# source first.sh
[root@localhost opt]# bash first.sh
[root@localhost opt]# ./first.sh # ./first.sh 先添加权限,再执行脚本
[root@localhost opt]# cat first.sh |bash
[root@localhost opt]# cat first.sh |sh
[root@localhost opt]# sh < first.sh
[root@localhost opt]# sh first.sh
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
[root@localhost opt]# source first.sh
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
[root@localhost opt]# bash first.sh
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
[root@localhost opt]# ./first.sh
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
[root@localhost opt]# cat first.sh |bash
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
[root@localhost opt]# cat first.sh |sh
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
[root@localhost opt]# sh < first.sh
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
- 完整过程
[root@localhost opt]# vim first.sh
#!/bin/bash
cd /opt/
pwd
ls -lh c*
echo "hello world"
[root@localhost opt]# ./first.sh
/opt
-rw-r--r--. 1 root root 6 7月 15 20:56 c.txt
-rw-r--r--. 1 root root 13 7月 15 20:55 cxc.txt
hello world
三、重定向与管道操作
1、重定向
1.1、交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述符编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
1.2、重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 将错误信息追加到指定的文件中 | |
混合输出 | &> | 将标准输出和标准错误的内容保存到同一个文件中 |
2、重定向输入
- 重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待 从键盘输入。
- 重定向输入使用“<”操作符。
- 通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。例如,使用 passwd 命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改 用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合 passwd 命令的“--stdin” 选项来识别标准输入)。
[root@localhost opt]# vim kfc.txt
111
222
333
444
555
wq保存并退出
[root@localhost opt]# passwd --stdin cxc < kfc.txt
更改用户 cxc 的密码 。
passwd:所有的身份验证令牌已经成功更新。
- 示例2
3、重定向输出
- 重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
- 重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件
- 若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。
将系统处理器类型的信息输出到文件 kernel.txt
中
[root@localhost opt]# uname -p > kernel.txt
[root@localhost opt]#
[root@localhost opt]#
[root@localhost opt]# cat kernel.txt
x86_64
将系统的内核版本号信息追加到 kernel.txt
文件的末尾。
[root@localhost opt]# uname -r >> kernel.txt
[root@localhost opt]#
[root@localhost opt]#
[root@localhost opt]# cat kernel.txt
x86_64
3.10.0-693.el7.x86_64
4、错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符
4.1、错误重定向作用
- 在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
- 还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁
[root@localhost opt]# echo abc > /dev/null //输入abc到null里面
[root@localhost opt]#
[root@localhost opt]# cat /dev/null //查看/dev/null
[root@localhost opt]# //没有内容
- 使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符
- 当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可 以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类 输出信息保存到同一个文件
[root@localhost opt]# ls /etc/passwd xxx &>> 1.txt
[root@localhost opt]#
[root@localhost opt]# cat 1.txt
ls: 无法访问xxx: 没有那个文件或目录
/etc/passwd
5、管道操作
管道操作符号 “|”
将左侧的命令输出结果,作为右侧命令的处理对象
- 使用格式
cmd1 命令1 | cmd2 命令2 [... | cmdn 命令n]
- 示例:
过滤出/opt/文件下的.txt文件
四、Shell脚本变量及赋值
1、shell的变量
变量是用来临时保存数据的,并且该数据时可以变化的,任何一个语言都离不开变量,如果某个内容需要多次使用并且会重复出现,这样就可以使用变量了,如果需要修改直接修改变量就可以了
常见 Shell 变量的类型
类型 | 描述 | 示例 |
---|---|---|
自定义变量 | 用户自行定义和使用的变量,可在脚本或程序中自由命名和赋值。 | user_name = Alice |
环境变量 | 在操作系统环境中定义的变量,用于传递配置信息和设置。 | PATH = /usr/bin |
只读变量 | 一旦赋值后不能更改的变量,通常用来保护关键数据的完整性。 | readonly PI = 3.14 |
位置变量 | 在脚本中用来表示命令行参数的位置的变量,如 $1 表示第一个参数。 | $1, $2, etc. |
预定义变量 | 编程语言或环境中预先定义好的变量,用于提供系统信息或控制特定行为。 | FILE, LINE |
2、Shell变量的作用
变量在编程中用于存储数据、传递信息、控制程序流程和简化代码。
- 变量名:临时存放数据的地方
- 变量值:临时的可变化的数据
3、自定义变量
3.1、定义一个新变量
变量名以字母或下划线开头,区分大小写,建议全大写
- 使用格式
变量名=变量值
注意:
- 等号两边没有空格
- 变量名称需以字母或下划线开头。
- 名称中不要包含特殊字符(如+、-、*、/、.、?、%、&、#等)
3.2、echo——查看变量
- 使用格式
echo $变量名
[root@localhost ~]# product=python //定义变量
[root@localhost ~]# version=2.3.12
[root@localhost ~]#
[root@localhost ~]# echo $product //查看一个变量
python
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo $product$version //查看两个变量
python2.3.12
[root@localhost ~]# echo ${product}3.5 //查看变量
python3.5
[root@localhost ~]# echo ${product} 3.5
python 3.5
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# test=666
[root@localhost ~]#
[root@localhost ~]# echo ${test}RMB
666RMB
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# xxx=6
[root@localhost ~]#
[root@localhost ~]# kfc="oppo $xxx"
[root@localhost ~]#
[root@localhost ~]# echo $kfc
oppo 6
[root@localhost ~]#
4、变量特殊的赋值操作
类型 | 描述 | 示例 |
---|---|---|
单引号 | 不识别变量,内容原样保存 | path='/usr/local/bin' |
双引号 | 识别变量,可以直接调用变量,内容中的变量和命令会被解析 | greeting="Hello, $name" |
反撇号 | 提取命令执行后的结果,和 $() 用法相同 | current_date=date |
4.1、单引号
- 不识别变量,内容原样保存
4.2、双引号
- 识别变量,可以直接调用变量,内容中的变量和命令会被解析
4.3、反撇号
- 提取命令执行后的结果,和
$()
用法相同
- 使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 “$()”来代替反撇号操作,以解决嵌套的问题
5、交互式定义变量
5.1、read命令
- 除了上述赋值操作以外,还可以使用 Bash 的内置命令 read 来给变量赋值。
- 用来提示用户输入信息,从而实现简单的交互过程。
- 执行时将从标准输入设备(键盘)读入 一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给 最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。
[root@localhost ~]# read test
wo xiang shangtian //用户自己输入信息
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo $test //查看变量
wo xiang shangtian
[root@localhost ~]#
5.2、read——常用参数
参数 | 描述 | 示例 |
---|---|---|
-p | 提示用户输入信息 | read -p 请输入用户名: username |
-n | 定义输入的字符数限制 | read -n 6 password |
-s | 输入内容不显示,常用于输入密码 | read -s -p 请输入密码: password |
-t | 定义超时时间,超过指定时间没有输入则自动退出,单位为秒 | read -t 10 -p 请输入验证码: verification_code |
一般来说为了使交互式操作的界面更加友好,提高易用性,read 命令可以结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等相关事项
- 示例1:
[root@localhost ~]# read -p "请输入你的姓名:" name
请输入你的姓名:cxc
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo $name
cxc
[root@localhost ~]#
- 示例2:
[root@localhost ~]# read -s -p "请输入你的密码:" passwd
请输入你的密码:[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo $passwd
123456
[root@localhost ~]#
- 示例3:
[root@localhost ~]# echo "wo yao da shi ge " > you.txt
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# read -p "请输入我的实力:" strength < you.txt
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# echo $strength
wo yao da shi ge
[root@localhost ~]#
6、变量的作用范围
默认情况下,新定义的变量只在当前的 Shell 环境中有效,因此称为局部变量,当进入子程序或新的子 Shell 环境时,局部变量将无法再使用
6.1、export命令
为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作,可以通过内部命令 export 将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔
[root@localhost ~]# num=xc90 //设置变量
[root@localhost ~]#
[root@localhost ~]# echo $num //查看变量
xc90
[root@localhost ~]#
[root@localhost ~]# bash //进入子shell环境
[root@localhost ~]#
[root@localhost ~]# echo $num
//无法显示变量
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# exit //登出
exit
[root@localhost ~]#
[root@localhost ~]# echo $num //查看变量
xc90
[root@localhost ~]#
[root@localhost ~]# export num //设置全局变量
[root@localhost ~]#
[root@localhost ~]# bash //设置变量环境
[root@localhost ~]#
[root@localhost ~]# echo $num //查看变量
xc90 //查看变量成功,可以显示
[root@localhost ~]#
- 但重启就无法生效了,可以修改配置文件永久设置
[root@localhost ~]#vim /etc/profile
export name=xc90
五、数值变量的运算及特殊变量
- 在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算
- 整数值的运算主要通过内部命令 expr 进行
- 运算符与变量之间必须有至少一个空格。
1、expr命令
expr命令不仅可以运算,还支持输出到屏幕
常用的运算:
- 运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
- 运算符号:$(()) 和$[]
- 运算命令:expr和let
- 运算工具:bc(系统自带)
运算符 | 描述 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算(需转义为 \* ,避免与文件通配符冲突) |
/ | 除法运算 |
% | 求模运算(取余数运算) |
1.1、常量的运算
[root@localhost ~]# expr 6+3 //错误格式,没有空格
6+3
[root@localhost ~]#
[root@localhost ~]# expr 6 + 3 //加法运算
9
[root@localhost ~]# expr 6 - 3 //减法运算
3
[root@localhost ~]# expr 6 * 3 //错误格式,没有\
expr: 语法错误
[root@localhost ~]# expr 6 \* 3 //乘法运算
18
[root@localhost ~]# expr 6 / 3 //除法运算
2
[root@localhost ~]# expr 6 % 3 //取余运算
0
[root@localhost ~]#
1.2、变量的运算
- 例一
[root@localhost ~]# x=35
[root@localhost ~]# y=5
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# expr $x + 5
40
[root@localhost ~]# expr $x + $y
40
[root@localhost ~]# expr $x - $y
30
[root@localhost ~]# expr $x \* $y
175
[root@localhost ~]# expr $x / $y
7
[root@localhost ~]# expr $x % $y
0
[root@localhost ~]#
- 例二
[root@localhost ~]# x=50
[root@localhost ~]# y=10
[root@localhost ~]#
[root@localhost ~]# expr $x + $x + $x
150
[root@localhost ~]# expr $y + $y + $y
30
[root@localhost ~]#
[root@localhost ~]# expr $x + $y + $y
70
[root@localhost ~]# expr $x + $y + $x
110
[root@localhost ~]#
[root@localhost ~]# sum=`expr $x + $y + $x `
[root@localhost ~]#
[root@localhost ~]# echo $sum
110
[root@localhost ~]#
- 例三
[root@localhost ~]#
[root@localhost ~]# read -p "请输入第一个数字:" num1
请输入第一个数字:4
[root@localhost ~]# read -p "请输入第二个数字:" num2
请输入第二个数字:3
[root@localhost ~]#
[root@localhost ~]# expr $num1 + $num2
7
[root@localhost ~]#
2、特殊的shell变量
2.1、环境变量
- 环境变量指的是出于运行需要而由 Linux 系统提前创建的一类变量
- 用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等
- 环境变量的值由 Linux 系统自动维护,会随着用户状态的改变而改变。
2.2、常见的环境变量
变量名 | 描述 |
---|---|
USER | 用户名称 |
HOME | 用户的宿主目录 |
LANG | 语言和字符集 |
PWD | 当前所在的工作目录 |
PATH | 命令搜索路径 |
RANDOM | 随机数,会返回0-32767的整数 |
USER | 当前账户的账户名称 |
- 使用 env 命令可以查看到当前工作环境下的环境变量
2.2.1、PATH 变量
- 用于设置可执行程序的默认搜索路径,
- 当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,
- 如果找不到则会提示“command not found”。
- 永久设置
[root@localhost ~]#vim /etc/profile
export PATH = $PATH:/root #设置为全局变量
wq //保存并退出
- 配置完不会立刻生效,需要刷新配置文件
[root@localhost ~]# source /etc/profile //刷新配置文件
2.2.2、只读变量
变量一经设定,其值是不可改变的!
2.2.3、位置变量
- 当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
- 位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
- 命令或脚本本身的名称使用“$0”表示
- vim编辑内容
2.2.4、预定义变量
预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而 不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示
参数 | 描述 |
---|---|
$# | 位置参数的个数。 |
$* | 所有位置参数作为单个字符串。 |
$@ | 所有位置参数作为独立的字符串。 |
$? | 上一个命令的退出状态(0表示成功,非零表示失败)。 |
$0 | 当前脚本或程序的名称。 |
$$ | 当前Shell进程的进程号。 |
$! | 最后一个后台进程的进程号 |
- vim编辑内容