一、shell基础
1、shell 概念
shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括Is、cd、pwd等等。
shell 在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用linux内核,这其实就是shell的本质。
使用专业术语的说法来解释,Shell其实是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。
2、shell脚本
■ shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻
辑,脚本不用编译即可运行,它从一定程度上减轻了工作量,提高了工作效率,还可以批
量、定时处理主机,方便管理员进行设置或者管理。
3、shell脚本编写注意事项
■ shell命名:shell脚本名称命名一般为英文、大写、小写、后缀以.sh结尾不能使用特殊符号、空格
■名称要写的一眼可以看出功能,也就是顾名思义
■ shell脚本首行需要#!/bin/bash开头
■ shell脚本变量不能以数字、特殊符号开头,可以使用下划线_,但不能用破折号
二、shell脚本的构成
■ 脚本声明
■ 注释信息
■ 可执行语句
三、编写shell脚本
1、编写简单的脚本并运行
[root@slv ~]# vim helloworld.sh
[root@slv ~]# bash helloworld.sh[root@slv ~]# source helloworld.sh
[root@slv ~]# chmod +x helloworld.sh
[root@slv ~]# ./helloworld.sh
2、编写nginx脚本
# 逻辑顺序:先交装依赖关系,再进入到系统默认的安装包目录src,使用wget命令到网上下载nginx1.26.1版本的交装包,然后解压,再移动到nginx 安装目录,执行编译安装并配置,编译,编译安装)
[root@slv ~]# vim install_nginx.sh
[root@slv ~]# chmod +x install_nginx.sh
[root@slv ~]# ./install_nginx.sh
四、变量
1、自定义变量
■ 变量名=值中,等于号=之前和之后不能有空格,比如:name=yang,这样是错的,
name=yang 才对■ 变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。
[root@slv ~]# b=4
[root@slv ~]# echo $b
4
2、环境变量
■ 由系统维护,用于设置工作环境
- $PWD
. $SHELL
· $USER
[root@slv ~]# echo $PWD
/root
[root@slv ~]# echo $SHELL
/bin/bash
3、在脚本中读取参数
[root@slv ~]# vim test001.sh
[root@slv ~]# bash test001.sh 1 2 3 4 5
1
2
3
4
5[root@slv ~]# bash test001.sh a b d f e
a
b
d
f
e
3、位置变量
$0:第一个字段表示命令名或脚本名称
$1:脚本要处理的第一个参数
$2:脚本要处理的第二个参数
Shell脚本最多可以直接处理9个参数
[root@slv ~]# vim createacc.sh
[root@slv ~]# bash createacc.sh zhangsan 1
4、预定义变量
Bash中内置的一类变量,不能直接修改
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创
建新的预定义变量,也不能直接为预定义变量赋值。$ *: 将所有参数作为整体
$@:单个数的组合,每个参数占一行
$0:保存了脚本名称$ ?: 保存命令或脚本的执行状态码
$#:保存脚本要处理的参数的个数
[root@slv ~]# vim test002.sh
[root@slv ~]# bash test002.sh 1 2 3 a b c
1 2 3 a b c[root@slv ~]# vim test002.sh
[root@slv ~]# bash test002.sh 1 2 3 a b c
1 2 3 a b c
0
6
test002.sh
5、变量的定义与输出
5.1 定义一个新的变量
格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写
5.2 变量符号运用
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:或$():命令替换,提取命令的执行结果
6、变量的作用范围
默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell 时,局部变量将无法再使用。
为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”。
格式 1:export 变量名
格式 2:export 变量名=值
五、判断语法
1、条件判断
[root@slv ~]# vim if.sh
[root@slv ~]# bash if.sh
两个数字不相等
2、数字判断
[root@slv ~]# vim if.sh
[root@slv ~]# bash if.sh
请输入一个数
2
请输入第二个数字
4
两个数字不相等
3、创建检测网络是否畅通脚本
[root@slv ~]# vim netping.sh
[root@slv ~]# bash netping.sh www.baidu.com
输入网址:www.baidu.com
PING www.a.shifen.com (180.101.50.188) 56(84) bytes of data.
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=1 ttl=128 time=29.6 ms
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=2 ttl=128 time=99.5 ms
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=3 ttl=128 time=35.6 ms[root@slv ~]# vim netping.sh
[root@slv ~]# bash netping.sh
输入网址:www.baidu.com
0[root@slv ~]# vim netping.sh
[root@slv ~]# bash netping.sh
输入网址:www.baidu.com
网络通畅
六、字符串判断
1、格式
[ 字符串1 == 字符串2] 字符串内容相同
[字符串1 != 字符串2] 字符串内容不同
[ -z 字符串 ] 字符串内容为空[-n字符串] 字符串内容不为空
[root@slv ~]# aaa="abc"
[root@slv ~]# echo $aaa
abc
[root@slv ~]# test $aaa == "abc"
[root@slv ~]# echo $?
0 //真
[root@slv ~]# test $aaa == "aaa"
[root@slv ~]# echo $?
1 //假
2、案例
2.1 用户登录
[root@slv ~]# vim zifu.sh
[root@slv ~]# bash zifu.sh
请输入账号admin
欢迎登陆:admin[root@slv ~]# bash zifu.sh
请输入账号abc
账号或密码错误
2.2 rpm检查是否安装软件
[root@slv ~]# vim rpm.sh
[root@slv ~]# bash rpm.sh
1[root@slv ~]# vim rpm.sh
七、文件、目录、权限判断
1、格式
[操作符 文件或目录]
常用的测试操作符:
-e“文件目录或自定变量” 判断文件或目录是否存在exists
-f“文件目录或自定变量” 判断是否为文件 isfile
-d"文件目录或自定变量” 判断是否为目录
-w“文件目录或自定变量” 判断是否可写
-r"文件目录或自定变量” 判断是否可读
-x“文件目录或自定变量” 判断是否可执行-s“文件目录或自定变量” 判断文件大小,非0时为真(若为非空文件,则为真)
-z"文件目录或自定变量” 判断变量参数值是否为空,为空为真,非空为假
2、示例
[root@slv ~]# touch abc
[root@slv ~]# ls -lh abc
-rw-r--r-- 1 root root 0 7月 26 11:26 abc[root@slv ~]# [ -e "abc" ]
[root@slv ~]# echo $?
0
[root@slv ~]# [ -e "zzz" ]
[root@slv ~]# echo $?
1
[root@slv ~]# [ -w "zzz" ]
[root@slv ~]# echo $?
1
[root@slv ~]# [ -w "abc" ]
[root@slv ~]# echo $?
0
[root@slv ~]# [ -x "abc" ]
[root@slv ~]# echo $?
1[root@slv ~]# chmod +x abc
[root@slv ~]# ls -lh abc
-rwxr-xr-x 1 root root 0 7月 26 11:26 abc
[root@slv ~]# [ -x "abc" ]
[root@slv ~]# echo $?
0
八、与或判断
判断多个条件
多个条件其中一个成立,或
多个条件都要成立,与
或运算判断:|| 或,两个条件满足其一即可,还有-o
与运算判断:&& 与,两个条件都得满足才行,还有-a
1、与判断
[root@slv ~]# vim test2.sh
[root@slv ~]# bash test2.sh
请输入名称hs^H
不行
[root@slv ~]# bash test2.sh
请输入名称hehe
友好
2、或判断
[root@slv ~]# vim test3.sh
[root@slv ~]# bash test3.sh
nl30
xb女
加钱
3、多重判断
[root@slv ~]# vim elif.sh
[root@slv ~]# bash elif.sh
1新增文件 2删除文件 3修改文件 4查找文件
请选择序号1
[root@slv ~]# ls
[root@slv ~]# bash elif.sh
1新增文件 2删除文件 3修改文件 4查找文件
请选择序号2
[root@slv ~]# ls
九、shell脚本读取用户输入和计算
1、shell读取用户输入
1. read命令
read:用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘
读取用户输下的数据;如果进行了重定向,那么可以从文件中读取数据。
1.1 格式
read[-选项][变量赋值]
1.2 选项
变量赋值:可以有一个,也可以有多个
-p: 显示提示信息
-s:静默模式,不会在屏幕上显示输入的字符。可用于输入密码或其他需要保密的信息
2. 示例
2.1 一个变量赋值
[root@slv ~]# read -p "输入一个数据" s
输入一个数据jdwdh
[root@slv ~]# echo $s
jdwdh
[root@slv ~]# read -p "输入一个数据" -s s
输入一个数据[root@slv ~]# echo $s
hdsuwgd
2.2 多个变量赋值
[root@slv ~]# read -p "三个变量" a b c
三个变量12 18 20
[root@slv ~]# echo $a
12
[root@slv ~]# echo $b
18
[root@slv ~]# echo $c
20
3. 案例
[root@slv ~]# vim register.sh
[root@slv ~]# bash register.sh
usrname:abc
passwd:1
更改用户 abc 的密码 。
passwd:所有的身份验证令牌已经成功更新。
账户abc注册成功
[root@slv ~]# su abc
[abc@slv root]$ su
密码:
十、循环语法
1、for循环
1. 语法
for 变量名 in 取值列表(范围)
do
命令序列
done
取值列表:数字范围、字符串、多个字符串、提前设定好的变量等
for默认以所有的空白字符进行分隔: tab、空格、回车,去循环处理
分隔成几段就循环几次
2.案例
[root@slv ~]# yum -y install inotify-tools
[root@slv ~]# mkdir /abc
[root@slv ~]# nohup inotifywait -mr /abc/
[root@slv ~]# cat nohup.out
[root@slv ~]# vim wait.sh
[root@slv ~]# bash wait.sh[root@slv ~]# vim loop.sh
[root@slv ~]# bash loop.sh[root@slv ~]# vim l.sh
[root@slv ~]# bash l.sh
青岛是个好地方
长沙是个好地方
庆阳是个好地方
2、while 循环
1. 作用
重复测试某个条件,只要条件成立则反复执行
2. 结构
while 条件测试操作
do
命令序列
done
3. while 和 for区别
while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出 if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出
十一、sed
1、概述
sed 是文本处理工具,读取文本内容,根据指定条件进行处理,可实现 增删改查的功能。sed 依赖于正则表达式。
2、格式
sed '过滤+动作' 文件路径
3、选项
-e 指定要执行的命令 (操作) ,只有一个编辑命令 (操作) 时可省略
-n 只输出处理后的行,读入时不显示,不对原文件进行修改
-i 直接修改源文件,不输出结果
十二、编辑命令格式
1、格式
'/地址 1,地址 2/操作(参数)'
地址 可为行数、正则表达式、$,没有地址代表全文
2、操作
p 打印(输出)
d 删除(整行)
s 替换(字符串匹配)
c 替换(整行)
r 读取指定文件(追加到行后)
a (append)追加到指定内容到行后
i (insert)追加指定内容到行前
w 另存为
n 表示读入下一行内容
H 复制到剪贴板
g 将剪贴板中的内容覆盖到指定行
G 将剪贴板中的内容追加到指定行后
3、示例
1. 配置一个自动设置静态ip以及关闭selinux服务 关闭防火墙服务 关闭NetWOrkManager,修改
主机名称的脚本,ip和主机名称使用read输入
#!/bin/bash
#备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak#修改dhcp为none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
read -p "请输入指定的ip地址" ip
#在文档最后添加5行
#IPADDR
sed -i '$aIPADDR='"$ip"'' /etc/sysconfig/network-scripts/ifcfg-ens33
#NETMAST
sed -i '$aNETMASK=255.255.255.0' /etc/sysconfig/network-scripts/ifcfg-ens33
#GATEWAY
sed -i '$aGATEWAY=192.168.8.2' /etc/sysconfig/network-scripts/ifcfg-ens33
#DNS1
sed -i '$aDNS1=8.8.8.8' /etc/sysconfig/network-scripts/ifcfg-ens33
#DNS2
sed -i '$aDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33
#修改uuid
sed -i '/UUID/cUUID='"$(uuidgen)"'' /etc/sysconfig/network-scripts/ifcfg-ens33#修改主机名称
read -p "请输入主机名称" hn
hostnamectl set-hostname $hn#停用selinux
setenforce 0
sed -i '/SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
#停用防火墙
systemctl stop firewalld
systemctl disable firewalld#停用NetworkManager
systemctl stop NetworkManager
systemctl disable NetworkManager#重启网络服务
systemctl restart network