shell编程—语句

一、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

结果:
在这里插入图片描述

七、倒计时

1、编写脚本time_end10.sh实现1:10倒计时

在这里插入图片描述

2、编写脚本time_end100.sh实现min:sec倒计时

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值