一、shell 脚本编程
1.1 简介
shell脚本就是一个文件
在这个文件中包含了要批量自动执行的命令
写shell脚本的基本规范
第一步:用vi/vim创建一个后缀是.sh的文件
第二步:在文件中写入内容
- 第一行是:#!/bin/bash 指定程序的解释器
- 从第二行开始是文件的正文
第三步:保存退出
第四步:给shell脚本赋权【赋予执行权限x】
第五步:执行shell脚本
vi/vim
- vim是vi的升级版
- 建议使用vim
- 可能需要安装vim
- 安装vim的方法:
- 配置好yum源
- 开始安装:yum install vim -y
shell脚本的注释
shell脚本中,是用#进行注释
关于脚本赋权
写法1:
chmod +x 脚本
写法2:
chmod 777 脚本
执行shell脚本
./脚本
案例:
#!/bin/bashecho "Hello boys"
echo "程序开始执行....."
whoamiecho "当前用户是`whoami`"
echo "当前主机的地址是:·ip addr s ens33 | awk -F "[/ ]+" 'NR==3{print $3}'`"
# [/ ]+ 匹配一个或多个斜杠或空格字符useradd aaa01echo "程序执行结束....."
1.2 变量
什么是变量
值会发生变量的对象
name='tom'
- name 是变量名
- tom 是变量的值
定义变量
1. 定义的格式
- 变量名=变量值 【=两边不能有空格】
- 变量名不能用引号
- 变量值可以用引号
2. 变量名的要求
- 只能有数字、字母、下划线(_)
- 不能以数字为开头
- 变量名要做到见名知意
- 建议定义格式
- 单驼峰格式:stuName
- 双驼峰格式:StuName
- 下划线拼接:stu_name
使用变量
$变量名
撤销变量
unset 变量名
注意:关于单引号的问题
' '无法将变量名替换成变量的值
案例:定义变量Animal=log,输出结果是 there are many dogs
#!/bin/bashAnimal="dog"echo "there are many ${Animal}s"
1.3 用户交互
格式:
read -p "给用户的提示:" 变量名
提示信息是给用户看的
用户输入的内容会保存到后面这个变量中
案例:
#!/bin/bashread -p "请输入你的姓名:" stuName
read -p "请输入你的年龄:" stuAge
read -p "请输入你的性别:" stuGenderecho "姓名:$stuName,年龄:$stuAge,性别:$stuGender"
1.4 四则运算
shell中,默认会将变量作为字符串,包括数字
格式:
$[数学表达式]
案例:让用户输入三个数字,输出三个数字的和
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
read -p "请输入第三个数字:" num3sum=$[$num1+$num2+$num3]echo "三个数字的和:$sum"
1.5 补充内容
命令执行状态值
输出结果重定向
命令执行状态值
执行状态是用来表示命令执行成功还是执行失败
命令的执行状态值,默认是不显示的
- Linux命令执行成功,用0表示
- Linux命令执行失败,用非0表示
用Linux的内置变量$?可以查看最近的一个命令的执行状态值
命令的执行输出有两种结果
输出结果:直接显示在终端上,给用户看的
状态结果:是给系统看的
输出重定向
输出重定向就是将原本要输出在终端中的内容,保存到一个文件中
重定向分为三种:
- 正确输出重定向(1,默认就是1,所以可以省略)
- 错误输出重定向(2,)
- 全部输出重定向(&)
两种方法
> 将命令的输出结果保存到一个文件中
如果文件不存在,就会创建一个新文件,然后将命令输出结果保存进去
如果文件存在,那么会将原有内容清空,然后将命令输出结果保存进去
>> 将命令的输出结果保存到一个文件中
如果文件不存在,就会创建一个新文件,然后将命令输出结果保存进去
如果文件存在,那么在文件原有内容后追加
案例:让用户输入一个用户名,判断这个用户是否存在
#!/bin/bashread -p "请输入一个用户:" userNameid $userName &>/dev/null
echo "判断用户执行结果:$?"
1.6 if 判断
1.6.1 判断格式
单分支
if 判断表达式;then执行的命令 #判断条件成立的情况下,执行这里的语句执行的命令 #判断条件成立的情况下,执行这里的语句执行的命令 #判断条件成立的情况下,执行这里的语句 fi
双分支
if 判断表达式;then执行的命令 #判断条件成立的情况下,执行这里的语句执行的命令 #判断条件成立的情况下,执行这里的语句执行的命令 #判断条件成立的情况下,执行这里的语句 else执行的命令 #判断条件不成立的情况下,执行这里的语句执行的命令 #判断条件不成立的情况下,执行这里的语句执行的命令 #判断条件不成立的情况下,执行这里的语句 fi
多分支
if 判断表达式1;then执行的命令 #判断条件1成立的情况下,执行这里的语句执行的命令 #判断条件1成立的情况下,执行这里的语句 elif 判断表达式2;then执行的命令 #判断条件2成立的情况下,执行这里的语句执行的命令 #判断条件2成立的情况下,执行这里的语句 elif 判断表达式3;then执行的命令 #判断条件3成立的情况下,执行这里的语句执行的命令 #判断条件3成立的情况下,执行这里的语句 else执行的命令 #判断条件不成立的情况下,执行这里的语句执行的命令 #判断条件不成立的情况下,执行这里的语句 fi
1.6.2 判断对象
判断数字
- 大小
- 相等
- 不相等
判断字符串
- 相同
- 不相同
判断文件
- 判断文件类型
判断命令
- 命令执行成功
- 命令执行失败
1.6.3 判断数字
格式:
[ 数字 判断符 数字 ]
判断符
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
-ne 不等于
-eq 等于
案例:让用户输入两个数字,判断两个数字的和是否大于100
read -p "请输入一个数字:" num1
read -p "请输入另一个数字:" num2sum=$[$num1+$num2]if [ $sum -gt 100 ];thenecho "和大于100"
elif [ $sum -lt 100];thenecho "和小于100"
elseecho "等于100"
fi
1.6.4 判断字符串
== 判断相等
!= 判断不相等
判断格式
[ 字符串1 判断符 字符串2 ]
案例:让用户输入一个用户名,判断这个用户名的shell类型是/bin/bash
#!/bin/bashread -p "请输入用户名:" userName# 判断用户名是否存在
# 如果用户不存在,退出程序
grep "^$userName\>" /etc/passwd &>/dev/null
num=$?
if [ $num -ne 0 ];thenecho "没有${userName}这个用户"exit 5 # 退出程序,返回一个数字5
fi# 如果用户存在的情况下,执行这里的操作
# 获取这个用户的shell类型
shellType=`grep "^userName\>" /etcpasswd | awk -F ":" '{print $7}'`
# 判断shell类型
if [ $shellType == "/bin/bash" ];thenecho "用户的shell类型是/bin/bash"
elseecho "用户的shell类型不是/bin/bash"
fi
1.6.5 组合条件
&& 逻辑与,要求多个条件要同时满足,则为真
|| 逻辑或,要求多个条件满足任意一个,则为真
! 逻辑非,对条件进行取反
案例:让用户输入账号和密码,检查用户的输入,如果账号是root,并且密码是123321,则提示登录成功,否则登录失败
#!/bin/bashread -p "请输入账号:" userName
read -p "请输入密码: " userPassif [ "a$userName:" == "aroot" ] && [ "a$userPass" == "a123321" ];thenecho "ok"
elseecho "error"
fi
扩展
&& 可以依次执行多个命令只有前面的命令执行成功,后面的才执行;如果前面的执行失败,后面的就不执行了|| 可以依次执行多个命令只有前面的命令执行失败,后面的命令才执行;如果前面的命令执行成功,后面就不执行了
1.6.6 判断文件
-a 判读文件是存在
-e 判读文件是存在
-f 判读文件是一般文件
-d 判断文件是目录文件
格式
[ 判断符号 文件名 ]
案例:让用户输入一个文件,判断文件类型
#!/bin/bash
read -p "请输入输入一个文件:" fileName
if [ -e $fileName ];thenif [ -f $fileName ];thenecho "这个文件是一般文件"elif [ -d $fileName ];thenecho "这个文件是目录文件"elseecho "我也不知道是个啥玩意"fi
elseecho "no such file"
fi
1.6.7 判断命令
判断命令有两种格式格式1:获取命令的状态值,然后判断这个值是否为0格式2:直接判断命令
read -p "请输入输入一个用户:" userNameid $userName &>/dev/null
num=$?
if [ $num -eq 0 ];thenecho "存在"
elseecho "不存在"
fi
1.6.8 判断变量是否为空
-n:当变量的值为非空的时候,返回真【条件成立】
-z:当变量的值为空的之后,返回则很难【条件成立】
案例1:让用户输入一个ip,判断这个ip是否在线
方法一:
#!/bin/bashread -p "请输入一个ip:"ipAddrnum=`echo $ipAddr | wc -c`
if [ $num -le 1 ];thenecho "你没有输入内容,你想干啥?"exit 9
elseif ping -c1 -W1 $ipAddr &>/dev/null;thenecho "存在"elseecho "不存在"fi
fi
方法二:
#!/bin/bashread -p "请输入一个ip:"ipAddrif [ -z $ipAddr ];thenecho "你没有输入内容,你想干啥?"exit 3
elseif ping -c1 -W1 $ipAddr &>/dev/null;thenecho "存在"elseecho "不存在"fi
fi