简介
什么是脚本
- 将要执行的Linux命令保存到一个文件中,然后通过执行这个文件来批量自动执行命令
作用
- 批量执行操作
- 重复执行操作
编写shell脚本的基本流程:
第一步:用vi创建一个后缀是.sh的文件
[root@localhost yum.repos.d]# vi yangshuai.sh
#第二步:在sh文件中写入内容
内容格式:
- 脚本的第一行是固定的 #!/bin/bash (!一定要用英文的中文的不行)
- 从脚本的第二行开始才是脚本的正文
#!/bin/bash (固定格式)
#创建一个用户名
useradd tom3#在home下创建一个叫ercheng的一般文件
touch /home/ercheng.txt#删除tmp下的文件
rm -rf /tmp/*#在home下创建一个名为陈梓博的目录
mkdir /home/chenzibo
第三步 : 保存退出
第四步:为脚本设置执行权限
[root@localhost yum.repos.d]# chmod +x yangshuai.sh
第五步:执行脚本
方法1:bash +脚本名
[root@localhost yum.repos.d]# bash yangshuai.sh
方法2: ./脚本名 ./后边不能加空格
[root@localhost yum.repos.d]# ./yangshuai.sh
变量
- 定义变量:变量名 = 变量值
- 获取变量:$变量名
echo命令
作用:用于打印输出一个信息到屏蔽
格式:
echo "输入的信息"
echo特殊效果
- ech -e "xxxxxxxxxxx \033[31m xxxx \033[0m"
案例:
#定义变量
[root@localhost ~]# name=zhaosi
[root@localhost ~]# from=xinle
[root@localhost ~]# tell=13537776288
[root@localhost ~]# mail=789@qq.com
#使用变量进行输出
[root@localhost ~]# echo "我的姓名是$name,我的家在$from, 我的电话是$tell,我的电子邮箱是$mail" 我的姓名是zhaosi,我的家在xinle, 我的电话是1357776288,我的电子邮箱是789@qq.com
输出的时候前边一定要加$
命令替换
- 将命令替换成命令的执行结果
案例:
创建文件,文件名是当前系统时间
[root@localhost ~]# touch `date +%T`.txt
案例:
定义变量保存当前系统的IP
[root@localhost ~]# ip=`ifconfig | grep "netmask" | awk -F " " '{print $2}'`
(变量中要用·· 反引号引起来)
[root@localhost ~]# echo $ip
192.168.31.101
# 定义变量保存当前系统的剩余内存大小
[root@localhost ~]# freeMen=`free -m | grep Mem | awk -F " " '{print $4}'`
判断
useradd命令
作用:创建新用户
格式:
useradd 用户名
useradd 用户名
- 一行就是一个用户的信息
- 以冒号为分割的部分中,第一部分就是用户名
userdel命令
作用:删除用户
格式:
userdel 用户名
passwd命令
作用:修改用户密码
格式:
passwd 用户名
id命令
作用:检查指定的用户的uid
格式:
id 用户名
判断有三种
- 判断命令
- 判断数字
- 判断文件
判断的格式
格式1:
if [ 判断条件 ] ;then
执行操作 # 只有当条件成立的时候,才会执行这里的操作
fi
格式2:
if [ 判断条件 ] ;then
执行操作 # 只有当条件成立的时候,才会执行这里的操作
else
执行操作 # 当条件不成立的时候执行
fi
if [ 判断条件 ] ; then
- 这里if和[ 之间必须用空格隔起来
- [ 这个后边也要加空格
- ] 这个前边也要加空格
例子1::判断两个数字的大小,输出大的数
#先vim创建个文件
[root@localhost ~]# vim ercheng.sh
#内容如下
#!/bin/bash
num1=1
num2=2
if [ $num1 -gt $num2 ];then
echo $num1
else
echo $num2
fi
#然后赋予这个脚本权限
[root@localhost ~]# chomd +X ercheng.sh
#然后执行这个脚本
[root@localhost ~]# bash ercheng.sh
案例2:判断文件/etc/passwd中是否有#开头的行
#先用vim创建个文件
[root@localhost ~]# vim lbsb.sh
#内容如下
#!/bin/bash
grep "^#" /etc/passwd
num3=$?
if [ $num3 -eq 0 ];then
echo"是#号开头"
else
echo "不是#开头"
fi
#然后赋予这个文件
[root@localhost ~]# chomd +X lbsb.sh
#然后执行这个文件
[root@localhost ~]# bash lbsb.sh
案例3:在home下创建一个目录,判断是否创建成功了
#先用vim创建个文件
[root@localhost ~]# vim jhls=.sh
#内容如下
#!/bin/bash
mkdir /home/chousb
num=$?
if [ $num -eq 0 ];then
echo "文件创建成功"
else
echo "文件创建失败"
fi
#然后赋予这个脚本权限
[root@localhost home]# =chmod +x jhls.sh
#然后执行这个脚本
[root@localhost home]# bash jhls.sh
案例4:判断用户tom是否存在
- 如果存在,则提示用户存在,并删除这个用户
- 如果不存在,则提示无此用户,并创建这个用户
内容如下:
#!/bin/bash
id tom&>/dev/null
num=$?
if [ $num -eq 0 ];then
echo "用户已存在,并未你删除"
userdel jerry &>/dev/null
else
echo "无此用户,并未你创建用户"
useradd jerry &>/dev/null
fi
命令的执行状态
- 执行成功:状态值是0
- 执行失败:状态值是非0
$? 用于获取离他最近的哪个命令的状态值,状态值为0的情况
- id 用户名,这个用户是存在的
- cd、ls正常执行的时候
- grep过滤到了需要的内容
例子
[root@localhost /]# cd home
[root@localhost home]# cat chousb
[root@localhost home]# mkdir chousb (就是$? 获取最近的就是 创建文件的这个状态)
关于状态值的是使用方法
1)要执行的命令
2)定义变量,保存状态值 num=$?
3)输出状态值 echo $num
判断数字
- [ 数字1 -gt 数字2 ] 判断数字1大于数字2
- [ 数字1 -lt 数字2 ] 判断数字1小于数字2
- [ 数字1 -eq 数字2 ] 判断数字1等于数字2
- [ 数字1 -ne 数字2 ] 判断数字1不等于数字2
- [ 数字1 -ge 数字2 ] 判断数字1大于等于数字2
- [ 数字1 -le 数字2 ] 判断数字1小于等于数字2
4、循环
for 变量 in 列表
do
done
列表的写法
- 直接写列表的元素
- {}生成元素,格式:{start..stop}
写法一:每隔2s输出一个数字,输出1-11的数字
#!/bin/bash
for num in 1 2 3 4 5 6 7 8 9 10 11 #数字之间要加空格
do
echo $num
sleep 2
done
写法二:每隔2s输出一个数字,输出1-11的数字
#!/bin/bash
for num in {1..11}
do
echo $num
sleep 2
done
案例:创建用户jerry1~jerry10,如果有的用户已经存在了,就提示用户已存在,而且不要再创建这个用 户了
[root@localhost ~]# vim ercheng.sh
#!/bin/bash
for num in {1..10}
do
id jerry$num &>/dev/null
car=$?
if [ $car -ne 0 ]; then
useradd jerry$num &>/dev/null
echo "user jerry$num 已为你创建用户"
else
echo "user jerry$num 创建用户已存在"
fi
done