1.1 简介
shell脚本就是一个文件,在文件中包含了要批量自动执行的命令
写shell脚本的基本规范
1、 用vi/vim创建一个后缀是.sh的文件
2、 在文件中写入内容
内容的第一行是:#!、bin/bash 指定程序的解释器
第二行开始是文件的正文
3、保存退出
4、给shell脚本赋权【赋予执行权限x】
5、执行shell脚本
shell脚本的注释:shell脚本中,是用#进行注释的
执行shell脚本:./脚本
1.2 变量
变量:值会发生变化的对象
定义变量:
1、变量名=变量值 【=两边不能留空格】
2、变量名不能用引号
3、变量值可以用引号
变量值是数字类型,则不引号
变量值是字符串类型,则必须用引号
变量名的要求:
1、只能有数字、字母、下划线(_)
2、不能以数字开头
3、变量名要做到见名知意
4、建议定义格式
单驼峰格式:stuName
双驼峰格式:StuName
下划线拼接:stu_name
使用变量:$变量名
注意:单引号无法将变量名替换成变量的值
1.3 用户交互
格式:
read -p "给用户的提示:" 变量名
提示信息是给用户看的,用户输入的内容会保存到后面这个变量中
例:
#!/bin/bash
read -p "请输入你的姓名:" stuName
read -p "请输入你的年龄:" stuAge
read -p "请输入你的性别:" stuSex
echo "欢迎:$stuName,你的年龄是:$stuAge,性别是:stuSex"
1.4 四则运算
格式:
$[数学表达式]
例子:
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
read -p "请输入第三个数字:" num3
sum=$[$num1+$num2+$num3]
echo "三个数字的和:$sum"
1.5 补充
命令执行状态值
输出结果重定向
命令执行状态值
执行状态是用来表示命令执行成功还是执行失败命令的执行状态值,默认是不显示的linux命令执行成功,用0表示linux命令执行失败,用非0表示用linux的内置变量$?可以查看 最近的一个命令 的执行状态值
命令的执行输出有两种结果
输出结果:直接显示在终端上,给用户看的状态结果:是给系统看的
输出重定向
输出重定向就是将原本要输出在终端中的内容,保存到一个文件中重定向分为三种:正确输出重定向(1,默认就是1,所以可以省略)错误输出重定向(2,)全部输出重定向(&)
两种写法
> 将命令的输出结果保存到一个文件中
如果文件不存在,就会创建一个新文件,让后将命令输出结果保存进去
如果文件存在,那么会将文件中原有内容清空,然后将命令输出结果保存进去
>> 将命令的输出结果保存到一个文件中
如果文件不存在,就会创建一个新文件,让后将命令输出结果保存进去
如果文件存在,那么在文件中原有内容后进行追加
#!/bin/bash
read -p "请输入一个用户:" userName
id $userName &> /dev/null
ehco "判断用户的执行结果:$?"
1.6 if判断
if 判断表达式;then
执行的命令 #判断条件成立的情况下,执行这里的语句
执行的命令 #判断条件成立的情况下,执行这里的语句
执行的命令 #判断条件成立的情况下,执行这里的语句
fi
多分支
if 判断表达式;then
执行的命令 #判断条件成立的情况下,执行这里的语句
执行的命令 #判断条件成立的情况下,执行这里的语句
执行的命令 #判断条件成立的情况下,执行这里的语句
else
执行的命令 #判断条件不成立的情况下,执行这里的语句
执行的命令 #判断条件不成立的情况下,执行这里的语句
执行的命令 #判断条件不成立的情况下,执行这里的语句
fi
if 判断表达式1;then
执行的命令 #判断条件1成立的情况下,执行这里的语句
执行的命令 #判断条件1成立的情况下,执行这里的语句
执行的命令 #判断条件1成立的情况下,执行这里的语
elif 判断表达式2;then
执行的命令 #判断条件2成立的情况下,执行这里的语句
执行的命令 #判断条件2成立的情况下,执行这里的语句
执行的命令 #判断条件2成立的情况下,执行这里的语句
elif 判断表达式3;then
执行的命令 #判断条件3成立的情况下,执行这里的语句
执行的命令 #判断条件3成立的情况下,执行这里的语句
执行的命令 #判断条件3成立的情况下,执行这里的语句
else
执行的命令 #判断条件都不成立的情况下,执行这里的语句
执行的命令 #判断条件都不成立的情况下,执行这里的语句
执行的命令 #判断条件都不成立的情况下,执行这里的语句
fi
1.7 判断数字
大小
相等
不相等
格式:
[ 数字 判断符 数字]
判断符
1、 -gt 大于
2、 -lt 小于
3、 -ge 大于等于
4、 -le 小于等于
5、 -ne 不等于
6、 -eq 等于
案例1:让用户输入两个数字,输出较大的数字
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
if [ $num1 -gt $num2 ];then
echo $num1
else
echo $num2
fi
案例2: 让用户输入两个数字,判断两个数字的和是否大于100
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
sum=$[$num1+$num2]
if [ $sum -gt 100 ];then
echo "和大于100"
else [ $sum -lt 100 ]
echo "和小于100"
else
echo "和等于100"
fi
案例3: 让用户输入一个用户名,判断这个用户名是否存在
#!/bin/bash
read -p "请输入一个用户名:" userName
id $userName &> /dev/null
num=$?
if [ $num -eq 0 ];then
echo "$userName 存在"
else
echo "$userName 不存在"
fi
1.8 判断字符串
相同
不相同
判断符
== 判断相等
!= 判断不相等
判断格式
[ 字符串1 判断符 字符串2 ]
案例:让用户输入一个用户名,判断这个用户名的shell类型是不是 /bin/bash
#!/bin/bash
read -p "请输入用户名:" userName
#判断用户名是存在,如果用户名不存在,退出程序
grep "^$userName\>" /etc/passwd &> /dev/null
num=$?
if [ $num -ne 0 ];then
echo "你输入的用户名是:$userName,不存在这个用户,再见."
exit 5 #退出程序,返回值为5
fi
#如果用户存在,执行下面的代码,获取这个用户的shell类型
shellType=`grep "^$userName\>" /ect/passwd | awk -F ":" '{print NF}'`
if [ $shellType == "/bin/bash" ];then
echo "用户的类型是/bin/bash"
else
echo "用户的类型不是/bin/bash
fi
1.9 组合条件
&& 逻辑与,要求多个条件要同时满足,则条件整体才是满足条件
|| 逻辑或,要求多个条件满足任意一个即认为整体条件是满足的
! 逻辑非,对条件进行取反
案例:让用户输入账号和密码,检查用户的输入,若账号是root,密码是123456,则提示登陆成功,否则登录失败
#!/bin/bash
read -p "请输入账号:" userName
read -p "请输入密码:" userPass
if [ $userName == "root" ] && [ $userPass == "123456" ];then
echo "登陆成功"
else
echo "登录失败"
fi
扩展
&& 可以依次执行多个命令
只有前面的命令执行成功,后面的才执行;如果前面的执行失败,后面的就不执行了
|| 可以依次执行多个命令
只有前面的命令执行失败,后面的命令才执行;如果前面的命令执行成功,后面就不执行了
1.10 判断文件
格式:
[ 判断符号 文件名 ]
判断符
-a 判断文件存在
-e 判断文件存在
-f 判断文件是一般文件
-d 判断文件是目录文件
案例1: 让用户输入一个文件,判断文件的类型
#!/bin/bash
read -p "请输入一个文件:" fileName
if [ -e $fileName ];then
if [ -f $fileName ];then
echo "这个文件类型是一般类型"
elif [ -d $fileName ];then
echo "这个文件类型是目录类型"
else
echo "其他类型"
fi
else
echo "no such file"
fi
案例2:让用户输入一个文件,判断文件的类型,如果是一个文件,检查这个文件中是否有以#开头的行
#!/bin/bash
read -p "请输入一个文件名:" fileName
if [ -e $fileName ];then
if [ -f $fileName ];then
grep "^#" $fileName &> /dev/null
num=$?
if [ $num -eq 0 ];then
echo "$fileName 是一般文件,且有以#开头的行"
else
echo "$fileName 是一般文件,但没有以#开头的行"
fi
elif [ -d $fileName ];then
echo "$fileName 是目录文件"
esle
echo "其他"
else
echo "no such file"
fi
1.11 判断命令
判断命令有两种格式
格式1:获取命令状态值,然后判断这个值是否为0
格式2:直接判断命令
案例1:让用户输入一个用户名,判断这个用户是否存在
#!/bin/bash
read -p "请输入输入一个用户:" userName
id $userName &>/dev/null
num=$?
if [ $num -eq 0 ];then
echo "存在"
else
echo "不存在"
fi
案例2:让用户输入一个ip,判断这个ip是否在线
#!/bin/bash
read -p "请输入输入一个ip:" ipAddress
if ping -c1 -W1 $ipAddress &>/dev/null;then
echo "存在"
else
echo "不存在"
fi
1.12 判断变量【空】
-n : 当变量的的值为非空的时候,返回真【条件成立】
-z : 当变量的的值为空的时候,返回真【条件成立】
案例:
#!/bin/bash
read -p "请输入一个ip地址:" ipAddress
if [ -z $ipAddress ];then
echo "你没输入"
exit 5
fi
if ping -c1 -W1 $ipAddress &> /dev/null;tehn
echo "存在"
else
echo "不存在"
fi