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