shell的执行流控制(for、while、until、if、case、expect)

1.for (循环)

知道循环次数,先判断后执行

1.1 for语句格式

 for 定义变量 
 do 使用变量,执行动作 
 done 结束标志 

格式1:

#!/bin/bash
for I in 1 2 3
do
        echo $I
done

在这里插入图片描述在这里插入图片描述


格式2:

#!/bin/bash
for I in `seq 1 2 10`
do
        echo $I
done

在这里插入图片描述在这里插入图片描述


格式3:

for I in {1..5}
do
        echo $I
done

在这里插入图片描述在这里插入图片描述


格式4:

#!/bin/bash
for ((I=0;I<10;I++))
do
        echo $I
done

在这里插入图片描述
在这里插入图片描述


1.2 脚本练习

check_host.sh
用此脚本检测10台与您当前主机直连主机是否网络通常
如果网络通常请显示主机的ip列表

方法一:

#!/bin/bash
for n in `seq 1 254`
do
    IP="192.168.0.${n[@]}"
    ping -c1 -w1 $IP &>/dev/null && {
    echo $IP
}
done

在这里插入图片描述
在这里插入图片描述
方法二:

#!/bin/bash
for IP in {200..209}
do
    ping -c1 -w1 192.168.0.$IP &>/dev/null
    [ "$?" = "0" ]&& {
    echo 192.168.0.$IP
}
done

在这里插入图片描述
在这里插入图片描述


2.while

先循环后判断,不知道循环次数
&&只做一次,while会循环做。

2.1 while语句格式

 while ture 条件为真 
 do 条件成立所作循环动作
 done

在这里插入图片描述
在这里插入图片描述


3.until

程序设计中的直到型循环,当不满足条件时循环,满足时跳出循环。

3.1 until语句格式

until false  条件为假 
do  条件不成立所作循环动作
done 

4.if

4.1 if语句格式

 if 
 then 
 elif 
 then 
 ... 
 else 
 fi

4.2 IF脚本练习

check_file.sh
please input filename: file
file is not exist
file is common file
file is direcory 此脚本会一直询问直到用户输入exit为止
方法一:函数脚本

CHECK()
{
        read -p "Please input filename:" FILENAME

if [ "$FILENAME" = "exit" -o "$FILENAME" = "EXIT" ]
        then
                echo "Bye"
                exit
elif [ ! -e "$FILENAME" ]
        then
                echo "$FILENAME is not exist."

elif [ -L "$FILENAME" ]
        then
                echo "$FILENAME is link."

elif [ -f "$FILENAME" ]
        then
                echo "$FILENAME is common file."
                
elif [ -d "$FILENAME" ]
        then
                echo "$FILENAME is directory."

elif [ -S "$FILENAME" ]
        then
                echo "$FILENAME is socket."

elif [ -b "$FILENAME" ]
        then
                echo "$FILENAME is block."

elif [ -c "$FILENAME" ]
        then
                echo "$FILENAME is char."
        fi
        CHECK
}
CHECK

在这里插入图片描述


方法二:while循环
在这里插入图片描述
在这里插入图片描述在这里插入图片描述


方法三:函数嵌套

#!/bin/bash
CHECK_FILE()
{
        if [ "$1" "$2" ]
        then
                echo $3
                ACTION
        fi
ACTION()
{
        read -p "Please input filename:" FILENAME
        if [ "$FILENAME" = "exit" -o "$FILENAME" = "EXIT" ]
        then
                echo "Bye"
                exit
        elif [ ! -e "$FILENAME" ]
        then
                echo "$FILENAME is not exist."
        fi
        CHECK_FILE -L $FILENAME  "$FILENAME is linkfile."
        CHECK_FILE -f $FILENAME  "$FILENAME is common file."
        CHECK_FILE -d $FILENAME  "$FILENAME is directory."
        CHECK_FILE -S $FILENAME  "$FILENAME is socket."
        CHECK_FILE -b $FILENAME  "$FILENAME is block."
        CHECK_FILE -c $FILENAME  "$FILENAME is char."
        ACTION
}
ACTION
}

在这里插入图片描述
在这里插入图片描述


5.case

5.1 CASE语句格式

case $1 in 
           word1|WORD1) 
           action1 
           ;; 
         
           word2|WORD2) 
           action2 
           ;; 
         
           *) 
           action3 
           esac
#!/bin/bash
case $1 in
        red|RED)
        echo "color"
        ;;
        1|2|3)
        echo "number"
        ;;
        *)
        echo error
esac

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


5.2 CASE练习

脚本练习
system_watch.sh disk memory upload (每秒显示)
disk 监控磁盘使用情况
memory 监控内存使用情况
upload 监控启动负载

#!/bin/bash
case $1 in
        disk|DISK)
        watch -n 1 df -h /
        ;;
        mem|MEM)
        watch -n 1 free -m
        ;;
        upload|UPLOAD)
        watch -n 1 uptime
        ;;
        *)
        echo "Error:Please input disk|mem|upload"
esac

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


6.expect(自动应答)

需要安装expect
dnf install expect -y

在这里插入图片描述

6.1 expect示例

问题脚本

#!/bin/bash
read -p "What's your name:" NAME
read -p "How old are you:" AGE
read -p "which objective:" OBJ
read -p "How are you feeling:" FEEL
echo $NAME is $AGE years old and $FEEL to learn $OBJ.

在这里插入图片描述 在这里插入图片描述


EOF应答脚本:必须完整回答
在这里插入图片描述
在这里插入图片描述


Expect应答脚本:可以检测问题关键字

1.多个expect
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.一个expect
在这里插入图片描述
在这里插入图片描述在这里插入图片描述


3.设定expect中的变量

 #!/usr/bin/expect 
 set timeout 1 
 set NAME [ lindex $argv 0 ] 设定变量
 set AGE  [ lindex $argv 1 ] 
 set OBJ [ lindex $argv 2 ] 
 set FEEL [ lindex $argv 3 ] 
 
spawn /mnt/ask.sh  #监控环境

expect { 
"name" { send "$NAME\r";exp_continue } 
"old" { send "$AGE\r";exp_continue } 
"objective" { send "$OBJ\r";exp_continue } 
"feeling" { send "$FEEL\r" } } 
expect eof

在这里插入图片描述
在这里插入图片描述


6.2 expect脚本练习

auto_ssh 192.168.0.1 westos
可以自动连接目标主机当目标主机网络不通时报错
方法一:

#!/usr/bin/expect
set IP   [ lindex $argv 0 ]
set PASS [ lindex $argv 1]

spawn ssh root@$IP
expect {
        "yes/no"    { send "yes\r";exp_continue }
        "password"  { send "$PASS\r"}
}
interact

在这里插入图片描述在这里插入图片描述


方法二:

#!/bin/bash
AUTO_CMD()
{
/usr/bin/expect <<EOF
spawn ssh root@$1 "$3"
expect {
        "yes/no"    { send "yes\r";exp_continue }
        "password"  { send "$2\r"}
}
expect eof
EOF
}

ping -c1 -w1 $1 &> /dev/null &&{
        AUTO_CMD $1 $2 "$3"
}

在这里插入图片描述
在这里插入图片描述

7.break,continue,exit

contiue终止当此次前循环提前进入下个循环
break终止当前所在语句所有动作进行语句外的其他动作
exit脚本退出

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值