1.if语句
if 如果
then 那么
单分支举例
检测目录cdrom是否存在,若不存在则创建
# vim a.sh
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ -z $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
echo "目录'${MOUNT_DIR}'已创建成功!"
fi
# vim fdisk.sh
#!/bin/bash
if [ $USER != root ]
then
echo "当前用户为${USER},该用户不是超级管理员,无法执行该命令!"
exit 1
#//当命令执行到此处时,将不再执行接下来的命令。如,将该值删除后,无论用户是不是root都将会执行fi之后的命令
fi
echo -e "\e[5;32m 该系统磁盘情况如下:\e[0m"
fdisk -l
双分支举例
else 否则
检测ping的对象是否能够连通,并反馈结果
# vim b.sh
#!/bin/bash
ping -c 1 -i 0.2 -W 3 $1 &> /dev/null
# -c包的个数,i测试时间间隔 W延迟3秒等待应答
if [ $? -eq 0 ]
then
echo "Host $1 is up!"
else
echo "Host $1 is down!"
fi
# bash b.sh 192.168.1.151
Host 192.168.1.151 is up!
#!/bin/bash
ping -c 4 $1 &> /dev/null
if [ $? -eq 0 ];then
echo "主机$1连接成功!"
else
echo "主机$1无法连接!"
fi
#!/bin/bash
Name=user1
if id $Name &> /dev/null;then
echo "user1存在,ID信息为:`id $Name`"
else
echo "user1不存在,正在建立该用户..."
useradd $Name
echo 123456 | passwd --stdin $Name &> /dev/null
fi
给一个用户,判断该用户是管理员还是普通用户:
#!/bin/bash
A=`id -u $1`
if [ $A -eq 0 ] &> /dev/null;then
echo "当前用户$1 的UID为:$A,为系统管理员!"
else
echo "当前用户$1 的UID为:$A,为普通用户!"
fi
升级:
#!/bin/bash
id $1 &>/dev/null
if [ $? -eq 0 ];then
A=`id -u $1`
if [ $A -eq 0 ];then
echo "当前用户$1 的UID为:$A,为系统管理员!"
else
echo "当前用户$1 的UID为:$A,为普通用户!"
fi
else
echo "你输入的用户名不存在!"
fi
查询httpd服务是否启动,没启动则启动。
#!/bin/bash
HTTPD=`netstat -anpt | grep httpd | awk -F: '{print $4}'`
STATUS=`pidof httpd`
#START=`apachectl start`
if [ -z $HTTPD ];then
echo "当前程序未启动,正在启动..."
apachectl start &> /dev/null &&echo -e "\e[5;32m 服务已启动! \e[0m"
else
echo -e "当前查询的服务状态为:\e[5;32m已启动! \e[0m\n相关进程ID号为:\n\e[1;36m $STATUS \e[0m"
fi
检测vsftpd服务是否运行,如果已经运行则列出监听地址、PID,否则提示不可用
#!/bin/bash
systemctl status vsftpd &> /dev/null
if [ $? -eq 0 ]
then
echo "监听地址:$(netstat -anpt | grep vsftpd | awk '{print $4}')"
echo "进程PID号:$(pgrep vsftpd)"
else
echo "警告:vsftpd服务不可用!"
fi
查询用户输入的服务是否启动,没启动则启动
#!/bin/bash
SERVERS=`netstat -anpt | grep $1`
SPID=`pgrep $1`
if [ -z "$SERVERS" ]
then
echo "当前程序未启动"
echo "正在启动该程序..."
systemctl start $1 &> /dev/null
SPID=`pgrep $1`
echo "当前程序已运行成功,PID为:$SPID"
else
echo "当前程序已运行,PID为:$SPID"
fi
# netstat -anpt | grep "10:22" | awk '{print $4}' | cut -d':' -f 1 //只截取sshd的监听ip地址
192.168.1.10
多分支举例
# vim d.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
echo "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo "$GRADE 分,合格"
else
echo "$GRADE 分?不合格"
fi
#!/bin/bash
read -p "请输入数字,0-5范围内:" A
if [ $A -eq 0 ]
then
echo "你输入的数字是$A!"
elif [ $A -eq 1 ]
then
echo "你输入的数字是$A!"
elif [ $A -eq 2 ]
then
echo "你输入的数字是$A!"
elif [ $A -eq 3 ]
then
echo "你输入的数字是$A!"
elif [ $A -eq 4 ]
then
echo "你输入的数字是$A!"
elif [ $A -eq 5 ]
then
echo "你输入的数字是$A!"
else
echo "你输入的数字不在规定范围内!"
fi
#!/bin/bash
read -p "请输入你要查询的分数(0-100):" A 90
if [ $A -ge 80 ]
then
echo "你的成绩为${A}分,很不错,你很优秀!"
elif [ $A -ge 60 ] && [ $A -lt 80 ]
then
echo "你的成绩为${A}分,你的成绩及格,请继续努力!"
elif [ $A -ge 40 ] && [ $A -lt 60 ]
then
echo "你的成绩为${A}分,你的成绩未及格,再稍微努力你就合格了!"
else
echo "你的成绩为${A}分,你上课是在开飞机吗?考那么点。"
fi
通过stty可以实现让用户在输入值时隐藏输入内容
#!/bin/bash
stty -echo
read -p "请输入你的密码:" password
#echo $password
stty echo //在使用stty -echo 后一定要结束使用stty,否则无法正常显示再次输入的内容。
# read -s -p "输入密码:" ABC 也可实现以上功能
read -n 8 abc //-n表示设置用户输入字符的数量,达到该值自动提交
举例:
#!/bin/bash
echo "输入密码:"
stty -echo
read -n 8 password
stty echo
# read -s -t 2 var //-t 限制时间内输入内容,默认单位为秒
# read -d "#" var //以特定字符结尾,如打10086要求输入身份证并以#号结尾
aaaaa#[root@pillarx1m ~]#
2.for
自动创建多个已定义的用户名及相同的密码:
# vim a.txt
a
b
c
d
e
# vim a.sh
#/bin/bash
ABC=`cat /root/a.txt`
for name in $ABC
do useradd $name
echo "redhat" | passwd --stdin $name
done
########思考:
根据已定义的用户列表创建相关用户及与用户名相同的密码:
#!/bin/bash
B=`cat /root/user.txt`
NULL="/dev/null"
for A in $B
do
useradd $A &> $NULL
echo "$A" | passwd --stdin $A &> $NULL
done
根据列出的主机IP,判断这些主机是否能够通信:
# vim ipadds.txt
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10
# vim chkhosts.sh
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
done
-c //发送包个数
-i //每个包发送间隔,单位为秒
-W //等待数据包回应时间,网络延迟低时可以设置为1,网络延迟高可设置高些。
按照递增顺序创建20个用户及设置密码:
通过命令批量创建多个用户:
# echo abc{01..10} |xargs -n1 | sed -r 's#(.*)#useradd \1#g' | bash
xargs -n1 //换行显示
-r //因为用到了(),因此要使用-r启用sed的扩展正则
s#(.*)#useradd \1#g //将括号(括号中的内容就是通过echo输出的内容)里的内容替换为useradd,再通过\1将之前括号里的东西输出到替换后的命令后面,最终结果就是:useradd abc01 -10
再通过最后的bash将之前生成的命令执行,即可创建10个用户。
通过命令批量创建多个用户及相同的密码:
# echo abc{01..10} |xargs -n1 | sed -r 's#(.*)#useradd \1;echo 123456 | passwd --stdin \1#g' | bash
通过命令批量创建多个用户及不同的密码:
# echo abc{01..10} |xargs -n1 | sed -r 's#(.*)#useradd \1;echo \1 | passwd --stdin \1#g' | bash
3.while
# vim uaddwhile.sh
#!/bin/bash
PREFIX="satu"
Uid=1
#定义自增量
while [ $Uid -le 20 ]
do
useradd ${PREFIX}$Uid
echo "123456" | passwd --stdin ${PREFIX}$Uid &> /dev/null
# let Uid++
done
let Uid++ //表示在Uid的基础上+1,以实现递增功能
let Uid+=10 //增加
let Uid-=1 //减
创建用户时编号以10位递增:
#!/bin/bash
PREFIX="aaa"
Uid=10
while [ $Uid -le 100 ]
do
useradd ${PREFIX}$Uid
echo "123456" | passwd --stdin ${PREFIX}$Uid &> /dev/null
let Uid+=10
done
# $RANDOM 在每次调用的时候,返回一个不同的随机整数
# 指定的范围是: 0 - 32767
# echo ${RANDOM:0:2} //表示取随机数,但是该数从0开始且只有2位数,":2"为值的位数,最高5位数
如果我们想要产生0-25范围内的数,如何做呢?如下:
# echo $(expr $RANDOM % 26)
用这个环境变量对26取模,就可以得到最小是0,最大是25的数了。
如果想得到1--68范围内的数,可以这样
# echo $(expr $RANDOM % 68 + 1)
前面可以得到最小为0,最大为67的随机数,再加上1,很自然的就可以得到最大为1,最小为68的数了。
如果想得到6--87范围内的数。可以这样
# echo $(expr $RANDOM % 82 + 6)
10-100
echo $(expr $RANDOM % 91 + 10)
前面可以得到最小为0,最大为81的随机数,再加上6,很自然的就可以得到最大为87,最小为6的数了。
# vim guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答对了, 实际价格是 $PRICE"
echo "你总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
1.通过while循环实现以下效果:
[root@pillar1m ~]# bash 10.sh
5
4
3
2
1
(1)case语句和if条件语句的适用性
case语句比较适合变量值较少且为固定的数字或字符串集合的情况,如果变量的值是已知固定的start/stop/restart等元素,那么采用case语句来实现就比较适合。
(2)case语句和if条件语句的常见应用场景
case主要是写服务的启动脚本。
if就是取值判断、比较,应用面比case更广。
几乎所有的case语句都可以用if条件语句来实现。
(3)case语句的特点及优势
case语句就相当于多分支的if/elif/else语句,但是case语句的优势是更规范、易读。
当变量的值等于值1时,执行指令1;等于值2时执行指令2,以此类推;如果都不符合,则执行"*)"后面的指令。
判断用户键入的字符类型:
# cat hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac
编写服务控制脚本:
#!/bin/bash
# chkconfig: - 85 15
case "$1" in
start)
/usr/sbin/apachectl start
echo "正在启动服务:httpd,-----服务启动成功!"
;;
stop)
/usr/sbin/apachectl stop
echo "正在停止服务:httpd,-----服务停止成功!"
;;
*)
echo $"请参照以下规则输入: {start|stop}"
esac