一、 shell的作用
Shell(壳) 是一类程序的总称,用于将人类使用的高级语言转换成机器能看懂的二进制语言,为用户和内核之间的交互提供接口。
二、 shell脚本简介
1.1 什么是shell脚本?
Shell脚本是一种用于编写和执行命令序列的脚本语言 Shell脚本可以通过文本文件的形式保存,并使用shell解释器来执行。 Shell脚本可以包含命令、条件判断、循环、函数等,可以使用变量、数组、字符串处理、文件操作等功能。
1.2 应用场景
将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率 减少手工命令的重复输入,一定程度上避免人为错误 将软件或应用的安装及配置实现标准化 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
2. Shell脚本构成
以一个简单的shell脚本为例
#!/bin/bash
#打印当前日期和时间
echo "当前日期和时间:"
date
#创建一个目录
mkdir test
#进入该目录
cd test
#创建一个文件并写入内容
echo "Hello, World!" > t1.txt
#显示文件内容
cat t1.txt
#!/bin/bash 使用Bash解释器执行脚本。
echo "当前日期和时间:" 使用echo命令打印一段文本,即"当前日期和时间:"。
date 输出当前的日期和时间。
mkdir mydirectory 创建一个名为test的目录。
cd test 进入test目录。
echo "Hello, World!" > myfile.txt 将"Hello, World!"写入到t1.txt文件中
cat myfile.txt显示t1.txt文件的内容。
3. Shell脚本执行方式
以/test/t1.sh为例 1 想要用tab键补全脚本名,需要做软链接,将目标脚本链接到$PATH的目录下。 1
3.1 路径方式 (需要赋予执行权限)
绝对路径
/test/t1.sh 相对路径
cd /test ./t1.sh
3.2 指定shell解释器去执行(不需要权限)
bash /test/t1.sh
3.3 source 和 . (不需要权限)
source命令会直接在当前shell中执行脚本文件的内容,会直接影响当前shell的环境,所以不推荐用这种方式。
#执行方式三#
source 脚本名(绝对路径)
source /test/t1.sh
或者
. /test/t1.sh
4. Shell脚本错误调试
语法错误 会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的。
命令错误 默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察。
逻辑错误 只能使用 bash -x 进行排错。 bash -x #模拟执行,可以逐条排错
bash -n #检查语法错误
二、重定向与管道符
1. 重定向
| 类型 | 设备文件 | 文件描述编号 | 默认设备 |
|---|---|---|---|
| 标准输入 | /dev/stdin | 0 | 键盘 |
| 标准输出 | /dev/stdout | 1 | 显示器 |
| 标准错误输出 | /dev/stderr | 2 | 显示器 |
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)
| 类型 | 操作符 | 用途 |
|---|---|---|
| 重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
| 重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
| >> | 将输出结果追加到指定的文件尾部 | |
| 标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
| 2>> | 标准错误输出结果追加到指定的文件尾部 | |
| 混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
2. 管道符
管道符 命令1 | 命令2
将管道符号“|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
三、Shell脚本变量
1. 变量简介
1.1 作用
Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。
1.2 变量类型
自定义变量:由用户自己定义,修改和使用。
特殊变量:环境变量、只读变量、位置变量、预定义变量。
2. 自定义变量
2.1 定义新变量
变量名=变量值
#=号前后不能有空格
2.2 查看自定义的变量
echo $变量名
#查看变量值
[root@localhost ~]# name=huang
[root@localhost ~]# echo $name
huang
2.3 赋值时的特殊符号
1.赋值时使用双引号(" ")可以直接调用变量
2.赋值时使用单引号(' ')变量只会被认为是字符不会调用变量
3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同
4.{}可以分隔变量值
单引号不识别 变量
双引号可以识别变量
{} 可以确定变量的范围
`` $() 调用命令执行的结果
2.4 read -p
read -p 是一个常用的Bash命令,用于从用户输入中读取值并将其存储在变量中。 -p 选项用于显示提示信息,提示用户输入。
[root@localhost ~]# . hello.sh
请输入你的名字:hzw
你好,hzw!
2.5 将局部变量变为全局变量
局部变量:新定义的变量只在当前的shell环境中有效,当进入子程序或新的shell环境中,局部变量将无法再起作用。
全局变量:在新的shell环境中可以继续使用。
通过内部命令export将局部变量为全局变量。
格式1:export 变量名 格式2:export 变量名=变量值
3. 环境变量
环境变量由系统提前创建,用来设置用户的工作环境。
env #可以看到当前所有的环境变量
3.1 环境变量的全局配置文件
#配置文件位置
/etc/profile
##修改此文件,全局生效,可用于长期变更或设置环境变量
4. 只读变量
将变量声明为只读(read-only)后,不能再修改变量的值。
readonly 变量名 #将变量声明为只读变量
5. 位置变量
2, n 表示命令行参数的位置值
2 表示第二个参数,以此类推。
当n大于9时,需要加上{ },比如第十个位置,要用 ${10}表示
#以shell脚本为例
#!/bin/bash
echo "$1" #位置1
echo "$2" #位置2
echo "$3" #位置3
echo "${10}" #位置10
echo "$10" #位置1和0
6. 预定义变量(重要)
- $*:表示所有位置参数的内容看成一个整体返回 返回所有
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
- $#:表示命令行中位置参数的总个数
- $0:表示当前执行的脚本或程序的名称 当前脚本的名字
-
- $!: 后台任务最后一个id
7. 整数运算
#运算符
+ 加法
- 减法
* 乘法
/ 除法
% 取余
#运算法则
加法:num1 + num2
减法:num1 - num2
乘法:num1 \ * num2
整除:num1 / num2
取余(求模):num1 % num2 (求 num1 除以 num2 的余数)
#变量和运算符之间要用空格隔开
#expr只能进行整数的运算
#格式
expr 变量1 运算符 变量2 [运算符 变量3]
i++和++i
i=1;j=1;let j=i++;echo $i $j
2 1
i=1;j=1;let j=++i;echo $i $j
2 2
四、简单的Shell脚本
使用shell脚本搭建本地yum仓库
#脚本名称 lyum.sh
#脚本内容#
#!/bin/bash
mount /dev/sr0 /mnt
cd /etc/yum.repos.d
mkdir backup
mv *.repo backup
echo "
[local]
name=local
baseurl=file:///mnt
grpcheck=0
" > local.repo
五、部分文本处理工具
1. tr命令
tr命令用于字符转换或字符删除。
1.1基本格式
tr [选项] 字符集1 字符集2 #字符集1 是要被替换或删除的字符集 #字符集2 是要替换为的字符集
1.2常用选项
-c 除了指定的字符之外的所有字符都会被替换 -d 表示删除指定的字符 -s 表示压缩重复的字符为单个字符
[root@localhost /]# echo 123 |tr 1 2
223
#将文本中的空格合并为单个空格
[root@localhost /]# echo "Hello World" | tr -s ' '
Hello World
#删除文本中的特殊字符
[root@localhost /]# echo "Hello @#World" | tr -d '@#'
Hello World
2. cut命令
cut命令可以提取文本数据中指定的列。 cut命令可以根据指定的字符位置或指定的字段分隔符来截取文本,并将结果输出到标准输出或指定的文件。
2.1 基本格式
cut [选项] 文件
-d 指定字段的分隔符,默认为制表符。 -f 指定要提取的字段列表,字段列表之间使用逗号分隔,例如-f 1,3,5 -c 指定要提取的字符位置列表,字符位置列表之间使用逗号分隔,例如-c 1-5,10-15 --complement 提取指定字段或字符位置之外的内容
#提取文件的第一列
cut -f1 file.txt
#提取文件的第二、四、五列,并使用逗号作为分隔符
cut -f2,4,5 -d',' file.txt
#提取文件的前五个字符:
cut -c1-5 file.txt
# 提取文件的第一列以外的所有列:
cut -f 2 --complement file.txt
3. sort命令
sort命令用于对文本文件进行排序,默认以字母排序
3.1 基本格式
sort [选项] file
3.2 常用选项
-b 忽略行首空白字符 -r 以倒序方式进行排序 -f 忽略大小写进行排序 -n 按照数值大小进行排序 -u 去除重复行 -t 指定字段分隔符 -k 指定按照字段排序
4. uniq命令
uniq 命令用于找出或删除文本文件中连续出现的重复行
5. 基本格式
uniq [选项] [输入文件 [输出文件]]
#如果不指定输入文件,则会从标准输入获取数据 #如果不指定输出文件,则结果会打印到标准输出
6. 常用选项
-c 在输出结果中显示每行重复出现的次数。 -d 只显示重复行。 -u 只显示不重复的行。
[root@localhost /]# df|grep "sd"|tr -s " "|cut -d " " -f5|cut -d "%" -f1
18
#查看磁盘利用率