一、简介
shell脚本就是一个文件
在文件中包含了要批量自动执行的命令
写shell脚本的基本规范
第一步:使用vi/vim 创建一个后缀是.sh的文件
第二步:在文件中写入内容
第一行是:#!/bin/bash 这是指定程序的解释器
第二行开始就是文件的正文
第三步:保存退出
第四步:给shell脚本赋权【赋予执行权限 x】 如果使用bash **.sh 的话是不用赋权的
第五步:执行shell脚本 ./ .sh
shell脚本的注释
shell脚本中,是用#进行注释的 ,是单行注释
1.2 变量
什么是变量? 值会发生变化的量
name="yom" name 就是变量名 tom是变量的值
定义变量格式
变量名=变量值 【=两边不能留空格】
变量名不能用引号
变量值可以用引号
变量值是数字类型的,可以不用引号
变量值是字符串类型的,必须用引号
2)变量名的要求(很多编程语言的变量名要求都是这个)
1、见名知义 2、变量名中只能有数字、字母、下划线
3、不能以数字开头 4、大小驼峰命名 、
使用变量: $变量名
注意:单双引号的问题 ''单引号无法将变量名替换成变量的值
如果涉及到变量名后紧跟字符的文件,需要将变量名用{}括起来 比如 ${变量名}s 这样
1.3 四则运算
shell中 默认会将变量作为字符串,包括数字
如果想要进行数学运算的话,必须用shell中的格式
格式:$[数学表达式]
比如:num1=3 ; num2=4 输出俩个数字的和
echo "$[$num1+$num2]"
1.4 补充内容
用户交互:read -p “提示用户输入的内容:” 变量名
提示信息是给用户看的‘
用户输入的内容会保存到后面的这个变量之中
命令执行状态值
输出结果重定向
命令执行状态值
执行状态是用来表示命令执行成功还是执行失败
命令的执行状态值,默认是不显示的
Linux命令执行成功,用0表示
Linux命令执行失败,用非0表示
用Linux的内置变量 $? 可以查看最近的一个命令的执行状态值
命令的执行输出有两种结果
输出结果:直接显示在终端上,给用户看的
状态结果:是给系统看的
输出重定向
输出重定向就是将原本输出在终端中的内容,保存带一个文件中
重定向分为三种:
标准输出重定向(1,默认就是1,所以可以省略) > 1>
错误输出重定向(2,)2>
全部输出重定向(&) &> 正确的错误的输出都可以用来输入到新的文件
ls /home /aaaaa.txt(这个文件并不存在) 这个命令既把正确的输出流,也把错误的输出了
我么可以这样写 l
s /home /aaaaa.txt(这个文件并不存在) 2>1 1>/tmp/aaa.txt
这样的话我们就可以即把错误的和正确的输出到文件中
另一种写法就是 ls /home /aaaaa.txt &> /tmp/aaa.txt
> 将命令的输出结果保存到一个文件中
如果文件不存在,就会创建一个新文件,让后将命令输出结果保存进去
如果文件存在,那么会将文件中原有内容清空,然后将命令输出结果保存进去
>> 将命令的输出结果保存到一个文件中
如果文件不存在,就会创建一个新文件,让后将命令输出结果保存进去
如果文件存在,那么在文件中原有内容后进行追加
&>/dev/null 这样写的话会把我们的输出都重定向到了这个黑洞文件中,不会有东西显示
1.5 if判断
判断格式 (必须要看格式来写,要不然容易出错)
单分支:
if [ 判断表达式 ];then
执行的命令 #判断条件成立的情况下,执行这里的语句
执行的命令 #判断条件成立的情况下,执行这里的语句
fi
双分支:
if [ 判断表达式 ];then
执行的命令 #判断条件成立的情况下,执行这里的语句
执行的命令 #判断条件成立的情况下,执行这里的语句
else
执行的命令 #判断条件不成立的情况下,执行这里的语句
fi
多分支:
if [ 判断表达式1 ];then
执行的命令 #判断条件1成立的情况下,执行这里的语句
执行的命令 #判断条件成立的情况下,执行这里的语句
elif [ 判断表示式2 ];then
执行的命令 #判断条件2不成立的情况下,执行这里的语句
else
执行的命令 #判断条件不成立的情况下,执行这里的语句
fi
判断对象
判断数字 : 大小 相等 不相等
判断字符串:相同与否
判断文件:判断文件类型
判断命令:命令执行成功与否
判断数字
大小 相等与否
格式 :[ 数字 判断符 数字 ]
判断服:-gt 大于 -lt 小于 -ge 大于等于 -le 小于等于 -eq 等于 -ne 不等于
判断字符串
相同与否
= 赋值
判断符 == 判断相等 != 不等
格式 :[ 字符串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\>" /etc/passwd | awk -F ":" '{print $7}'`
# 判断shell类型
if [ $shellType == "/bin/bash" ];then
echo "用户的shell类型是/bin/bash"
else
echo "用户的shell类型不是/bin/bash"
fi
组合条件
&& 逻辑与 要求多个条件要同时满足,则条件整体才是满足条件可以依次执行多个命令 只有前面的命令执行成功,后面的才执行;如果前面的执行失败,后面的就不执行了
|| 逻辑或 要求多个条件满足任意一个即认为整体条件是满足的
可以依次执行多个命令 只有前面的命令执行失败,后面的命令才执行;如果前面的命令执行成功,后面就不执行了
! 逻辑非 对条件进行取反
判断文件
-a -e 判断文件是否存在
-f 判断文件是一般文件 -d 判断文件是目录文件
[ 判断符号 文件名 ]
案例:让用户输入一个文件名,判断文件的类型
#!/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
判断变量【空】
-n 当变量是非空的时候,返回为真 【条件成立】
-z 当变量的值为空时,返回为真【条件成立】
#!/bin/bash
read -p "请输入一个IP" ipAddress
num=`echo $ipAddress | wc -c`
if [ $num -le 1];then
echo "你没有输入内容"
exit 5
else
if ping -c1 -W1 $ipAddress &>/dev/null;then
echo "存在"
else
echo "不存在"
fi
fi
ping -c1ping的次数 -W1 等待时间
#!/bin/bash
read -p "请输入一个IP" ipAddress
if [ -z $ipAddress ];then
echo "你没有输入内容"
exit 5
else
if ping -c1 -W1 $ipAddress &>/dev/null;then
echo "存在"
else
echo "不存在"
fi
fi
ping -c1ping的次数 -W1 等待时间