文章目录
一、Shell脚本概述
Shell脚本就是将要执行的命令按顺序保存到一个文本文件,并给该文件分配可执行权限,方便一次性执行的一个程序文件。
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件分配可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
1、应用场景
主要是方便管理员进行设置或管理,可结合格式Shell控制语句以完成更复杂的操作,常用于以下场景:
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
2、作用–命令解释器,“翻译官”
结余系统内核与用户之间,负责解释命令行;使用命令管理系统,所有可以看做是一系列命令的集合,按顺序从上到下执行
cat /etc/shells #查看系统可支持的shell环境
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
目前大多数linux系统采用的默认shell环境是bash,shell环境都可以使用yum安装
yum -y install ksh #安装ksh shell环境
yum -y install csh #安装csh shell环境
.....
我们来大概看一下bash和sh的区别,相对来说bash比较方便好用
3、文本输出-echo命令
- echo -n #表示不换行输出
- echo -e #表示转义字符
- \c不换行输出,在“\c”后面不存在字符的情况下,作用相当于echo -n
- \n换行输出,且多一行空格
- 使用echo命令的-e选项,除了能够输出转义字符,还能够在命令行中输出彩色的字符,或是带有彩色背景的字符
举例说明
echo -e "\e[33mhello\e[0m"
- 从代码来看分为两部分:\e[31m 和\e[0m
- 这些代码有一个专业名词,叫做“ANSI控制码”
- 我们习惯把 \e[31m理解成“开始输出红色字符”,把\e[0m理解成“结束输出红色字符”\
- 当echo -e遇到\e[31m的时候,就认为自己要输出红色字符了,\e[31m就是一个信号,它告诉echo -e,需要开始输出红色字符了,\e[0m也是一种信号,[0m是结束符,它告诉echo -e命令,红色字符已经输出结束了,在输出的字符应该是黑白字符了,不能是彩色的了
下面是字体输出颜色及终端格式控制
- 字体色范围:30-37
- 字背景颜色范围:40-47
实例
二、Shell脚本编程规范
1、编写第一个shell脚本文件
- 使用vim文本编辑器
- 每行一条linux命令,按执行顺序依次编写,脚本文件内容
- #!/bin/sh #声明解释器;固定格式顶行写
- 注释信息
- 可执行语句
vim test.sh #shell脚本不以扩展名定义,.sh为了好识别是shell脚本
#!/bin/bash #声明解释器
#这是我的第一个脚本 #注释信息
#作者:可乐卷 #注释信息
echo "hello world" #可执行语句
- 编辑多行脚本内容;有两种方式
- 一种添加注释#
- 第二种“<<”
- 一种添加注释#
2、执行脚本文件
2.1、添加可执行权限
添加权限之后可以使用相对路径和绝对路径,具体看下图
chmod +x test.sh #添加可执行权限
./test.sh #执行test.sh脚本文件;相对路径
/root/test.sh #执行test.sh脚本文件;绝对路径
2.2、不添加可执行权限
- 调用解释器执行:bash、sh
bash 脚本名称
sh 脚本名称
- source test.sh
注意点:若移动脚本文件至其他目录,需要使用绝对路径
- . test.sh;source相当于“.”
2.3、小结
- source和.是在当前的shell执行脚本
- 其余都是会在当前shell另外再开一个shell环境执行脚本,比如bash、sh、绝对路径等
验证一下:
vim test.sh #新建一个脚本
#!/bin/bash #声明解释器
sleep 1000 #睡眠1000s;代码内容
pstree #再打开一个shell查看pstree
source test.sh
bash test.sh
- sh和bash执行文件的区别
- sh:遇到错误就不会执行后面的脚本
- bash:遇到错误仍会继续执行,把整个脚本走完一遍
验证一下:
vim test.sh
bash test.sh
sh test.sh
2.4、实操
- 创建一个脚本,当前目录下创建目录klj,klj目录下创建文件zz,并移动到opt目录下
3、检测脚本
bash -x 脚本 #显示执行过程,通常当脚本很长的时候便于定位;会把脚本中的每条命令的执行情况打印出来
bash -n 脚本 #仅检查语法错误,如果用vim编写的话,正常的话会变色仅检测语法错误,会显示出错误的行数
实例:
4、实操
实验要求:配置本地yum源并且查询正在使用的yum源
#!/bin/bash
mount /dev/sr0 /mnt
cd /etc/yum.repos.d/
mkdir repo.bak
mv * repo.bak/
echo "[centos7]
name=centos7
baseurl=file:///mnt
enable=1
gpgcheck=0">>/etc/yum.repos.d/repo.repo
yum clean all
yum makecache
yum repolist
实验结果
三、shell脚本变量
1、变量的作用
- 用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
2、自定义变量
自定义变量是由系统用户自己定义的变量,只能用户自己的shell环境中有效,相当于局部变量;因此又称本地变量。
- 定义变量的基本格式:变量名=变量值,等号两边没有空格
- 变量名称需以字母或者下划线开头,名称中不可用包含特殊字符(如+、-、*、/、?、%、&、#等)
2.1、查看和引用变量的值
- 使用ehco命令查看变量,$:shell环境中表示调用变量
- 且变量名区分大小写
2.2、变量赋值的操作
- 大括号–${}
${}:相当于分界符
- 单双引号–(’’)、(“”)
- 有特殊符号时
- 单引号里的任何字符都会以原样输出,单引号中的变量是无效的
- 双引号 (双引号里可以有变量,也可以出现转译字符)双引号主要起界定字符串的左右,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况双引号可以省略
- 无特殊符号的时,单引号和双引号一个概念
- 有特殊符号时
- 转义符
转义符跟双引号类似,当赋值的内容中包含空格时,使用转义符,可以输出变量值
- 反撇号(`)
反撇号主要是用于命令替换,允许将执行某个命令的平米输出结果赋值给变量;反撇号括起来的范围内必须是能够执行的命令行,否则会出错
ls -lh `which useradd`
使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用“$()”来代替反撇号操作,以解决嵌套的问题
which rz #查找出rz命令的程序位置
rpm qf # 查找安装的软件包
- 交互式定义变量-read命令
除了上述赋值操作以外,还可以使用bash的内置命令read来给变量赋值;用来提示用户输入信息,从而实现简单的交互过程;执行时将从标准输入设备读入一行内容,并以空格为分隔符,将读入的各字段挨个复制给指定的变量(多余的内容赋值给最后一个变量)。
- 直接定义变量name,光标不动等待用户输入,输入shell,变量的值就会复制给name
- 常用选
-p:友好的输入;提示输
-n num:限制变量值最多的字符数
-s :静默模式;常用于输入密码场景
实例:
自定义创建新用户和密码
vim user.sh #创建脚本文件 #user.sh
增加一条:name=lisi;代表只能增加一个用户lisi
2.3、整数变量的运算
固定格式: expr 变量1 运算符 变量2 [运算符 变量3]…
常用运算符
- +:前后需要空格
- -:前后需要空格
- *:需要添加转义符\
- /:取除的整数
- %:取余数
- **:次方
与自定义变量结合使用
使用调用echo
**:次方
$[]
$()
let:无法直接输出答案,需要echo运算出结果
a++=a+1:是使用的a后,再对a进行加1
a–=a-1
++a=1+a:先把a加1,然后再使用a
bc:系统自带的计算器,处理整数
scale: (decimal places) 范围(小数位数)
3、环境变量
3.1、概念
环境变量指的是处于运行需要而有linux系统提前创建的一类变量,用户不变的情况下,一直延用环境变量
- 使用env命令可以查看当前工作环境下的所有环境变量
echo 环境变量 #查看单个环境变量
- 常见的环境变量
- $USER
- $UID
- $PWD
- $HOSTNAME
- …
3.2、自定义变量变成环境变量
- 临时性: export 变量名;在不改变登录用户的情况下一直存在
bb=20
export bb #直接在shell环境输入
exit系统退出即失效
- 永久:若需要改变用户时,变量仍存在,需要写入配置文件
vim /etc/profile #环境变量配置文件
export aa=10 #
source /etc/profile #重新读入配置文件
echo $aa
有时脚本操作会进入很多层级,需要不停exit退出才能彻底退出系统,那么有什么方法可以查询shell的层级呢?
- echo $SHLVL #查看当前shell的层级
3.3、实操
实验要求:可以执行test.sh
给脚本文件赋予可执行权限,仍无法执行
因为uesr.sh不在$PASH的目录里面,所以系统无法直接用,需要跟上绝对路径使用该脚本
- 方法一:写入环境变量的配置文件
vim /etc/profile
PATH=$PATH:/root #增加一行变量
- 方法二:临时加入环境变量
4、只读变量-readonly
readonly 脚本 #只读变量
赋值只读无法更改变量值,取消只读变量,只能退出exit,重新连接;或者更改shell变量,比如更换bash环境即可
5、位置变量
传递参数给到脚本内
$0:当前执行的脚本
$1:脚本的第一个参数
$2:脚本的第二个参数
…以此类推
实例
vim klj.sh
实例
6、预定义变量
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
预定义变量使用"$”符号和另一个符号组合表示
$#:表示命令行中位置参数的个数
$*: 表示所有位置参数的内容,这些内容当做一个整体
$@:表示所有列出位置参数,但是是以单个的形式列出
$?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常
$0:表示当前执行的脚本或程序的名称
$$: 表示当前进程的进程号
$!: 上一个后台进程的进程号
$?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常
7、查询变量
unset 变量名 #取消/清除/释放变量
set #查看系统所有变量;包含自定义变量和环境变量
set | grep AAA:查询变量AAA
拓展知识
四、重定向
1、交互式硬件设备
- 标准输入:从键盘输入,设定键盘为输入设备
- 标准输出:通过显示器输出到屏幕
- 标准错误:当我执行一个命令时,显示器会把错误信息输出到屏幕
类型 | 设备文件 | 文件描述编号 | 默认设置 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /devstderr | 2 | 显示器 |
2、重定向操作
重定向输出:>=1>;>>=1>>
/dev/null:系统自带的黑洞系统,相当于垃圾桶;null:黑洞;/dev:设备
<:输入:把屏幕前的结果输入到指定文件内
vim pass.txt