3.5 Shell的执行流控制

For语句

  • 作用

    为循环执行动作

  • For语句结构

    for		##定义变量
    do		##使用变量,执行动作
    done	##结束标志
    
  • For语句的基本格式

    • 格式1
    #!/bin/bash
    for TEST in 1 2 3
    do
    	echo $TEST
    done
    
    1
    2
    3
    
    • 格式2
    #!/bin/bash
    for TEST in `seq 1 3`
    do
    	echo $TEST
    done
    
    1
    2
    3
    
    ##自定义步长
      #!/bin/bash
    for TEST in `seq 1 2 6`
      do
      	echos $TEST
      done
    
      1
      3
      5
    
    • 格式3
#!/bin/bash
  for TEST in {1..3}
    do
    	echo $TEST
    done
  
    1
    2
    3
  • 格式4
#!/bin/bash
for ((TEST=0;TEST<5;TEST++))
do
  echo $TEST
done

0
1
2
3
4

条件语句

  • While…do语句

    • 作用

      条件为真执行动作

    • 语句结构

      while true		##条件为真
      do				##条件成立时所作循环动作
      done			##结束
      
  • Until…do语句

    • 作用

      条件为假执行动作

    • 语句结构

      until false		##条件为假
      do				##条件不成立时所作循环动作
      done			##结束
      
  • If…then…elif…then…else…fi语句

    • 作用

      多次判定条件执行动作

    • 语句结构

      if				##首次判断条件是否成立
      then			##条件成立所执行的动作
      elif			##当首次判定不成立时再次判定
      then			##再次判定成立所执行的动作
      ...				##elif可以书写多次
      else			##所有条件都不成立所执行的动作
      fi				##结束
      

Case

case $1 in
  word1|WORD1)
  action1
  ;;
  word2|WORD2)
  action2
  ;;
  *)
  action3
esac

##条件判断
##条件符合1时执行action1
##条件符合2时执行action2
##都不符合时执行action3
##因为只会进行一次判断,在字符匹配方面的效率较上面的要高,但是进行其他判断的效率就很低了

自动应答

dnf install expect -y

##问题脚本内容
#!/bin/bash
read -p "What is your name: " NAME
read -p "How old are you? " AGE
read -p "Which object you study: " OBJ
read -p "Are you happy? " FEEL
echo $NAME is $AGE\'s old study $OBJ feel $FEEL

##应答脚本
#!/bin/bash
set timeout 1
spawn /mnt/ask.sh
expect {
	"name"	{ send "NeuWings\r";exp_continue }
	"old"	{ send "18\r";exp_continue }
	"object"	{ send "Linux\r";exp_continue }
	"happy"	{ send "happy\r" }
}
expect eof		##表示退出expect交互环境
interact		##表示不退出expect交互环境

##应答脚本的传参写法
#!/bin/bash
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 }
	"object"	{ send "$OBJ\r";exp_continue }
	"happy"	{ send "$FEEL\r" }
}
expect

Break, Continue, Exit

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

$?			##存储退出值
#################################
# Author:         NeuWings
# Create_Time:    2021/03/10
#################################
#!/bin/bash

for NUM in {1..5}
do
  [ $NUM = "4" ] && {
    echo "LUCKY NUMBER $NUM"
  }
  echo $NUM
done

echo "END"

##执行结果
1
2
3
LUCKY NUMBER 4
4
5
END


##加入Continue
for NUM in {1..5}
do
  [ $NUM = "4" ] && {
    echo "LUCKY NUMBER $NUM"
    continue
  }
  echo $NUM
done

echo "END"

##执行结果,可以看到跳过了echo "4"的部分,提前进入了下个循环
1
2
3
LUCKY NUMBER 4
5
END

##加入break
for NUM in {1..5}
do
  [ $NUM = "4" ] && {
    echo "LUCKY NUMBER $NUM"
    break
  }
  echo $NUM
done

echo "END"
##执行结果,可以看到执行到break时直接终止了循环,跳出到了echo "END"的部分
1
2
3
LUCKY NUMBER 4
END

当执行exit时,脚本会退出,不同的退出原因有着不同的退出值.

$?的内容就是退出值的值.

但同时,$?的值也可以在退出时直接进行指定.

##举例代码
for NUM in {1..5}
do
  [ $NUM = "4" ] && {
    echo "LUCKY NUMBER $NUM"
    exit
  }
  echo $NUM
done

echo "END"

echo $?
0

##对退出值直接进行指定
for NUM in {1..5}
do
  [ $NUM = "4" ] && {
    echo "LUCKY NUMBER $NUM"
    exit 5
  }
  echo $NUM
done

echo "END"

echo $?
5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值