一、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脚本的构成
脚本声明
注释信息
可执行语句
三、编辑脚本
1、脚本一
[root@git ~]# vim helloworld.sh
#!/bin/bash
echo "hello world"
ls -lh /etc/
2、两种执行方式
[root@git ~]# bash helloworld.sh
[root@git ~]# chmod +x helloworld.sh
3、安装nginx脚本
[root@git ~]# vim install_nginx.sh
# 逻辑顺序:先安装依赖关系,再进入到系统默认的安装包目录src,使用wget命令到网上下载nginx-1.8.0阪本的安装包,然后解压,再移动到nginx 安装目录,执行编译安装并配置,编译,编译安装)
[root@git ~]# bash install_nginx.sh
四、变量
1、自定义变量
变量名=值中,等于号=之前和之后不能有空格,比如:name = yang,这样是错的
name=yang 才对变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。
2、环境变量
由系统维护,用于设置工作环境
- $PWD 当前所在目录
. $SHELL 那一套系统
· $USER 当前用户
[root@git ~]# env 查看所有的环境变量
3、位置变量
位置变量有0,n,n为1~9之间的数字
■ $0:第一个字段表示命令名或脚本名称
■ $1:脚本要处理的第一个参数
■ $2:脚本要处理的第二个参数
[root@git ~]# vim test001.sh
[root@git ~]# bash test001.sh 1 2 3 4 5
1
2
3
4
[root@git ~]# vim create.sh
[root@git ~]# bash create.sh a a
更改用户 a 的密码 。
passwd:所有的身份验证令牌已经成功更新。
4、预定义变量
Bash中内置的一类变量,不能直接修改
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创
建新的预定义变量,也不能直接为预定义变量赋值。$ *: 将所有参数作为整体
$@:单个数的组合,每个参数占一行
$0:保存了脚本名称$ ?: 保存命令或脚本的执行状态码
$#:保存脚本要处理的参数的个数
[root@git ~]# vim new.sh *一行显示
[root@git ~]# bash new.sh 1 2 a
1 2 a
[root@git ~]# vim new.sh @一列显示
[root@git ~]# bash new.sh 1 2 a
1
2
a
5、变量的定义与输出
(1)定义一个新的变量
格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写(2)变量符号运用
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:或$():命令替换,提取命令的执行结果
(3)输入和输出
输入格式:read [-p "显示的提示信息"] 变量名 输出格式:echo $变量名
[root@git ~]# vim new.sh
[root@git ~]# bash new.sh 1 2 a
1
2
a
0
3
new.sh
ping 测试脚本
[root@git ~]# vim network.sh
[root@git ~]# bash network.sh
请输入网址www.baidu.com
[root@git ~]# vim network.sh
[root@git ~]# bash network.sh
请输入网址www.baidu.com
0
[root@git ~]# vim network.sh
[root@git ~]# bash network.sh
请输入网址www.baidu.com
网络畅通
0
四、字符串判断
1、格式
■[字符串1==字符串2] 字符串内容相同
■[字符串1 != 字符串2] 字符串内容不同
■[-z字符串] 字符串内容为空
■[-n 字符串] 字符串内容不为空
[root@git ~]# aaa="abc"
[root@git ~]# echo $aaa
abc
[root@git ~]# test $aaa == "abc"
[root@git ~]# echo $?
0
[root@git ~]# test $aaa == "aaaa"
[root@git ~]# echo $?
1
[root@git ~]# test $aaa == "aaa"
[root@git ~]# echo $?
1[root@git ~]# unset aaa
[root@git ~]# echo $aaa
五、if条件判断
1、if 单分支语句
if 条件判断; then
条件成⽴执⾏的命令(可以有多个命令,命令执行方式为逐行执行要么全执行,要么全不执行)
fi
[root@localhost test]# vim if.sh
#!/bin/bash
num1=3 # 给定变量
num1 num2=3 # 给定变量
num2 if [ $num1 -eq $num2 ];then # 判断num1变量是否等于num2
echo "$num1 equal $num2" # 如果等于,那么执行命令,echo输出
echo "in if"
fi
[root@localhost test]# sh ./if.sh
3 equal 3
in if
2、if多条件判断
if 条件判断; then
条件成⽴执⾏的命令(可以有多个命令)
else
条件不成⽴执⾏的命令(可以有多个命令)
fi
[root@git ~]# vim menu.sh
[root@git ~]# bash menu.sh
3、多重判断语法 elif
if 条件1; then
#命令,条件1成⽴执⾏
elif 条件2;then
#命令,条件1不成⽴,条件2成⽴执⾏
elif 条件3;then
#命令,条件1不成⽴,条件2不成⽴,条件3成⽴执⾏
else
#命令 ,以上条件都不成⽴执⾏
fi
[root@git ~]# vim test.sh
[root@git ~]# bash test.sh
请输?您的分数(0-100):20
20分,不及格!
六、与或判断
判断多个条件
多个条件其中一个成立,或
多个条件都要成立,与
或运算判断:|| 或,两个条件满足其一即可,还有-o
与运算判断:&& 与,两个条件都得满足才行,还有-a
七、shell脚本读取用户输入和计算
1、shell读取用户输入
1. read命令
read:用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘
读取用户输下的数据;如果进行了重定向,那么可以从文件中读取数据。
(1) 格式
read[-选项][变量赋值]
(2)选项
变量赋值:可以有一个,也可以有多个
-p: 显示提示信息
-s:静默模式,不会在屏幕上显示输入的字符。可用于输入密码或其他需要保密的信息
(3)read 可以同时给多个变量赋值
[root@git ~]# read -p "三个变量" a b c
三个变量1 2 3
[root@git ~]# echo $a
1
[root@git ~]# echo $b
2
[root@git ~]# echo $c
3
(4)注册账户脚本
[root@git ~]# vim register.sh
[root@git ~]# bash register.sh
username:abc
passwd:abc
更改用户 abc 的密码 。
passwd:所有的身份验证令牌已经成功更新。
账户abc注册成功
[root@git ~]# su abc
[abc@git root]$ su
密码:
八、循环语法
1、for循环
(1)作用
读取不同的变量值,以逐个执行同一组命令
(2)结构
for 变量名 in 取值列表(范围)
do
命令序列
done
取值列表:数字范围、字符串、多个字符串、提前设定好的变量等
for默认以所有的空白字符进行分隔:tab、空格、回车,去循环处理
分隔成几段就循环几次
(3)案例
[root@git ~]# mkdir /abc
[root@git ~]# nohup inotifywait -mr /abc/
[root@git ~]# vim wait.sh
[root@git ~]# bash wait.sh
[root@git ~]# vim loop.sh
[root@git ~]# bash loop.sh 我是
我是
[root@git ~]# vim city.sh
[root@git ~]# bash city.sh
青岛是个好地方
庆阳是个好地方
九、sed
sed 是文本处理工具,读取文本内容,根据指定条件进行处理,可实现 增删改查的功能。sed 依赖于正则表达式。
1、格式
sed '过滤+动作' 文件路径
2、选项
-e 指定要执行的命令 (操作) ,只有一个编辑命令 (操作) 时可省略
-n 只输出处理后的行,读入时不显示,不对原文件进行修改
-i 直接修改源文件,不输出结果
1.配置一个自动设置静态ip以及关闭selinux服务 关闭防火墙服务 关闭NetWOrkManager,修改
主机名称的脚本,ip和主机名称使用read输入
[root@git ~]# vim initserver.sh
#!/bin/bash
# 备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
read -p "请输入IP地址"
# 替换DHCP为 none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
# 在文档最后添加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 -p '/SELINUX=enforcing/c/SELINUX=disabled' /etc/selinux/config
#停用防火墙
systemctl stop firewalld
systemctl disable firewalld
#停用NetworkManagersystemctl stop NetworkManager
systemctl disable NetworkManager