流程控制
1、if else
1.1 if
- if 语句语法格式:
if condition; then
command1
command2
...
commandN
fi
demo
- 举例
vim if_test.sh
#!/bin/bash
a=20
if [ $a -gt 10 ]; then
echo "a 大于 10"
fi
末尾的fi就是if倒过来拼写,后面还会遇到类似的
1.2 if else
- if else 语法格式:
if condition; then
command1
command2
...
commandN
else
command
fi
1.3 if else-if else
- if else-if else 语法格式:
if condition1; then
command1
elif condition2; then
command2
else
commandN
fi
elif 是 elseif的简写
1.4案例
- 需求1 :判断 a 是否大于 100
- 需求2 :判断 a 是否等于 b
- 需求3 :判断 a 与 b 比较
- 需求4 :判断 (a + 10) 和 (b * b) 比较大小
vim if_test.sh
#!/bin/bash
a=20
b=10
# 需求1: 判断 a 是否大于 100
if [ $a > 100 ]; then
echo "$a 大于 100"
fi
# 需求2: 判断 a 是否等于 b
if [ $a -eq $b ]; then
echo "$a 等于 $b"
else
echo "$a 不等于 $b"
fi
# 需求3: 判断 a 与 b 比较
if [ $a -lt $b ]; then
echo "$a 小于 $b"
elif [ $a -eq $b ]; then
echo "$a 等于 $b"
else
echo "$a 大于 $b"
fi
# 需求4: 判断 (a + 10) 和 (b * b) 比较大小
if test $[ a + 10 ] -gt $[ b * b ]; then
echo "(a+10) 大于 (b * b)"
else
echo "(a+10) 小于或等于 (b*b)"
fi
2、for 循环
2.1 格式
for variable in (list); do
command
command
...
done
2.2案例
- 需求1: 遍历 1~5
- 需求2: 遍历 1~100
- 需求3: 遍历 1~100之间的奇数
- 需求4: 遍历 根目录 下的内容
vim for_test.sh
#!/bin/bash
# 需求1: 遍历 1~5
for i in 1 2 3 4 5; do
echo $i;
done
for i in {1..5}; do
echo $i
done
for(( i=1; i<=5; i++ )); do
echo $i
done
# 需求2: 遍历 1~100
for i in {1..100}; do
echo $i
done
# 需求3: 遍历 1~100之间的奇数
for i in {1..100..2}; do
echo $i
done
# 需求4: 遍历 根目录 下的内容
for f in `ls /`; do
echo $f
done
3 、while语句
- while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while condition; do
command
done
- 需求: 计算 1~100 的和
- 初始值; i=1
- 和值: sum=0;
- while i<=100;
- sum = sum + i;
- i++;
- 打印 sum的值
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]; do
sum=$[ sum + i]
i=$[ i + 1 ]
done
echo $sum
- 运行脚本,输出:
5050
4、无限循环
- 无限循环语法格式:
while true; do
command
done
- 需求: 每隔1秒 打印一次当前时间
#!/bin/bash
while true; do
date
sleep 1
done
5、case(switch)
- Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
- case工作方式如上所示。
取值后面必须为单词i
n,每一模式必须以右括号结束
。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 - 取值将检测匹配的每一个模式。
一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式
。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 - 下面的脚本提示输入1到4,与每一种模式进行匹配:
echo '输入 1 到 4 之间的数字:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
- 输入不同的内容,会有不同的结果
6、跳出循环
- 在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:
break和continue
。
6.1 break命令
break命令允许跳出所有循环(终止执行后面的所有循环)
。
- 需求: 执行死循环 每隔1秒打印当前时间, 执行10次停止
#!/bin/bash
#需求: 执行死循环 每隔1秒打印当前时间, 执行10次停止
i=1;
while true; do
sleep 1
echo $i `date +"%Y-%m-%d %H:%M:%S"`
i=$[ i + 1]
if [ $i -gt 10 ]; then
break
fi
done
6.2 continue
- continue命令与break命令类似,只有一点差别,
它不会跳出所有循环,仅仅跳出当前循环
。 - 需求: 打印 1~30, 注意 跳过3的倍数
#!/bin/bash
# 需求: 打印 1~30, 注意 跳过3的倍数
for i in {1..30}; do
if test $[ i % 3 ] -eq 0; then
continue
fi
echo $i
done