shell的执行流控制

for

for定义变量
do使用变量,执行动作
done结束标志
  • 格式1:
    #!/bin/bash
    for WESTOS in `seq 2 2 10`
    do
    echo $WESTOS
    done在这里插入图片描述

注:中间的2代表的步,每隔两位输出2到10的一个数

  • 格式2:
    for WESTOS in 1 2 3
    do
    echo $WESTOS
    done
    在这里插入图片描述

  • 格式3:
    for WESTOS in {10…1}
    do
    echo $WESTOS
    done在这里插入图片描述

注:正序或者逆序显示

  • 格式4:
    for ((WESTOS=0;WESTOS<10;WESTOS++))
    do
    echo $WESTOS
    done
    在这里插入图片描述

w

hile
书写格式:

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

until

书写格式:

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

注: while和until语句的true或者false可以写成其他判定语句

if

书写格式:

if 条件1
then
	#条件1成立时所做的命令
elif 条件2 
then
	#条件2成立所做的命令
...
else 
	#上述条件都不成立时所做的命令
fi

脚本练习:
需求:当执行check_file.sh这个脚本时;会询问你想要查询的文件名字,判断该文件是什么类型的文件,知道输入的是exit时会退出

	#!/bin/bash
while true
do
        read -p "Please input filename: " FILE
        if [ -z "$FILE" ]
        then
                echo -e "\033[31mError:Please input correct filename\033[0m"
        elif [ "$FILE" = "exit" ]
        then
                exit
        elif [ ! -e "$FILE" ]
        then
                echo -e "\033[31mError:$FILE is not exist\033[0m"
        elif [ -L "$FILE" ]
        then
                echo -e "\033[32m$FILE is soft link\033[0m"
        elif [ -f "$FILE" ]
        then
                echo -e "\033[32m$FILE is a file\033[0m"
        elif [ -d "$FILE" ]
        then
                echo -e  "\033[32m$FILE is directory\033[0m" 
        elif [ -S "$FILE" ]
        then
                echo -e "\033[32m$FILE is socket\033[0m"
        elif [ -c "$FILE" ]
        then
                echo -e "\033[32m$FILE is character device\033[0m"
        elif [ -b "$FILE" ]
        then
                echo -e "\033[32m$FILE is Block device\033[0m"
        else
                echo -e "\033[31mError:Unknown file type\033[0m"
        fi
done

测试:在这里插入图片描述
在这里插入图片描述

case

书写格式

case $1 in
        word1|WORD1) #输入的命令是word1或者WORD1时执行action1动作
        action1
        ;;
        word2|WORD2) #输入的命令是word2或者WORD2时执行action1动作
        action2
        ;;
        *) 			#输入的命令不是上述的所有命令时执行action3动作
        action3  
esac

注:case和if的区别:if 是从上到下一次判定,而case是先匹配输入的命令在执行符合该条件的动作

脚本练习:
需求:当执行system_watch.sh 脚本时,后面跟disk memory upload其中的一个时:
(每秒显示)

  1. disk 监控磁盘使用情况
  2. memory 监控内存使用情况
  3. upload 监控启动负载
#!/bin/bash
case $1 in
        disk|DISK)
                watch -tn  1 df -H
                ;;
        memory|MEMORY)
                watch -tn 1 free -m
                ;;
        upload|UPLOAD)
                watch -tn 1 uptime
                ;;
        *)
        echo -e "\033[31mError:Please input correct options!!\033[0m"
esac

expect

dnf install expect -y

  • 问题脚本
    vim /mnt/ask.sh

    #!/bin/bash
    read -p "what's your name:" NAME
    read -p "How old are you: " AGE
    read -p "Which objective: " OBJ
    read -p "Are you ok? " OK
    echo $NAME is $AGE\'s old study $OBJ feel $OK
    
  • 应答脚本
    vim /mnt/answer.exp

    #!/usr/bin/expect
    set timeout 1 #设置遇到没有的反应时间为1s
    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 }
            "ok"            { send "$FEEL\r" }
    }
    expect eof
    

测试:
chmod +x /mnt/ask.sh
在这里插入图片描述
参数:interact 代表拥有交互的shell

break,continue,exit

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值