一、for语句
1、for语句格式
for i in {1..10} | `seq 1 3 10` #步距为3,即每隔3执行
do
sleep 1 ##执行命令后休眠时间为1s
done
2、编写脚本测试1-10号主机是否可达
#!/bin/bash
for IP in {1..10}
do
ping -c1 -w1 172.25.254.$IP &>/dev/null && echo "172.25.254.$IP is up!" || echo "172.25.254.$IP is down!"
done
运行结果
3、编写脚本,自动建立userfile中的用户
#!/bin/bash
for User in `cat $1`
do
useradd $User
done
4、编写脚本create_user.sh将/root/userfile与/root/passwdfile一一对应
要求格式不对时报错!
#!/bin/bash
[ $# -lt 2 ] && {
echo Error:Please give a userfile and a passwdfile!!
exit 1
}
MIN_NUM=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
for User in `seq 1 $MIN_NUM`
do
User_name=`sed -n ""$User"p" $1`
Passwd=`sed -n ""$User"p" $2`
useradd $User_name
echo $Passwd | passwd --stdin $User_name
done
脚本运行结果:
5、编写脚本,批量创建用户,且随机生成密码,并将创建的用户和对应的密码写入文件中
#!/bin/bash
for((i=1;i<=10;i++))
do
username="wuyanzu${i}"
password=`tr -dc "a-zA-Z0-9" </dev/urandom | head -c 8`
useradd $username || echo "权限不足!!"
echo $username:$password | chpasswd
echo ${username} ${password} >> /root/shell/passwd.txt
done
6、编写脚本time_end.sh实现10秒倒计时
#!/bin/bash
for SEC in {10..1}
do
echo -n "After $SEC seconds is end"
echo -ne "\r \r"
sleep 1
done
二、while语句
1、编写脚本use_memory.sh,当根分区内存使用超过30%时,每隔10s生成告警日志
[root@localhost shell]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
6.5G 1.2G 5.1G 19% /
tmpfs 246M 0 246M 0% /dev/shm
/dev/sda1 477M 33M 419M 8% /boot
[root@localhost shell]# cat user_memory.sh
#!/bin/bash
Use_Mem=`df | awk -F " " '/\/$/{print $4}' | cut -d "%" -f 1`
while [ $Use_Mem -ge 30 ]
do
echo "Permissive:Memory of root directory is more than 30%" \
>> /var/log/memory.log
sleep
done
或者user_memory01.sh
#!/bin/bash
while true
do
Use_Mem=`df | awk -F " " '/\/$/{print $4}' | awk -F % '{print $1}'`
[ $Use_Mem -ge 30 ] && {
echo "Permissive:Memory of root directory is more than 30% " |
>> /var/log/memory.log
}
sleep 10
done
三、if语句
1、编写脚本User_create.sh ,当文件个数不符合或者文件不存在时报错
复杂型
#!/bin/bash
if [ $# -eq 2 ]
then
[ -e $1 ] && {
[ -e $2 ] && {
NIN_NUN=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
for Num in `seq 1 $NIN_NUN`
do
User_name=`sed -n ""$Num"p" $1`
Passwd=`sed -n ""$Num"p" $2`
useradd $User_name
echo $Passwd | passwd --stdin $User_name
done
} || echo Error:$2 is not exist!!
} || echo Error:$1 is not exist!!
else
echo Error:please give a userfile and a passwdfile!!
fi
2、编写脚本,cat_dog.sh。当输入cat时,输出dog,输入dog时,输出cat,其他则报错
#!/bin/bash
if [ "$1" = cat ]
then
echo dog
elif [ "$1" = dog ]
then
echo cat
else
echo Error:please input cat or dog after script!!
fi
3、编写脚本,监控服务,服务正常时提示ok,服务异常时自动重启
#!/bin/bash
[ -z $ ] && {
echo "Please enter service name!!"
exit 1
}
ServiceName="$1"
date=`date "+%Y-%m-%d %H:%M;%S"`
status=`netstat -antulp | grep "$ServiceName" | awk -F " " '{ print $6 }'`
if [ "$status" == "LISTEN" ]
then
echo "${date} ${ServiceName} is ok!!" >>/tmp/service_status.log
else
/etc/init.d/${ServiceName} start &>/dev/null
echo "${date} ${ServiceName} restart is ok!!" >>/tmp/service_status.log
fi
四、case语句
case语句横向同时比较,效率优于if语句
1、编写脚本server_ctrl.sh,当输入命令时,对httpd服务进行操作
#!/bin/bash
[ -z $1 ] &&{
echo Error:please input a commond after script!!
exit 1
}
case $1 in
install)
yum install -y httpd
;;
start)
/etc/init.d/httpd start
;;
port)
netstat -antuple | grep httpd
;;
enable)
chkconfig httpd on
;;
*)
echo Error:$1 is not found!
esac
五、expect语句
#注意:需要安装expect服务#
expect:自动应答脚本,具备自己的运行环境;针对某一脚本,自动输出结果
1、编写脚本passwd.exp,自动修改root用户密码
#!/usr/bin/expect
spawn passwd
expect "New"
send "redhat\r"
expect "Retype"
send "redhat\r"
expect eof
运行结果:
2、编写脚本ssh.exp,自动远程指定主机,并停在当前位置
#!/usr/bin/expect
set IP [ lindex $argv 0 ]
set PASSWD [ lindex $argv 1 ]
spawn ssh root@$IP
expect {
"yes/no" { send "yes\r";exp_continue}
"password" { send "$PASSWD\r" }
}
interact
运行结果:
3.编写脚本check_host10.sh,输出76-80网络通的主机名
/bin/expect <<EOF ##在当前脚本插入EOF之间的命令
set timeout 2 ##休眠时间2s,即无法链接是停顿2s,马上进入下一循环
spawn ssh root@172.25.254.$IP hostname ##监控ssh命令,链接成功后执行hostname命令
…
EOF
#!/bin/bash
for IP in {1..10}
do
ping -c1 -w1 172.25.254.$IP &> /dev/null && {
/usr/bin/expect << EOF
set timeout 2
spawn ssh root@172.25.254.$IP hostname
expect {
"yes/no" { send "yes\r"; exp_continue }
"password" { send "redhat\r" }
}
expect eof
EOF
}
done
六、脚本语句控制器
1、exit 退出脚本,可给出退出值
脚本
#!/bin/bash
for i in {1..10}
do
echo $i
while [ $i = 5 ]
do
echo $i welcome
exit
# break
# continue
done
done
运行结果:
2、break 退出当前循环
脚本:
#!/bin/bash
for i in {1..10}
do
echo $i
while [ $i = 5 ]
do
echo $i welcome
# exit
break
# continue
done
done
运行结果:
3、continue 提前结束循环内部的命令,但不终止该循环
#!/bin/bash
for i in {1..10}
do
echo $i
while [ $i = 5 ]
do
echo $i welcome
# exit
# break
continue
done
done
结果: