shell脚本 流程控制语句
Shell提供了丰富的语句判断方式,包括数字,字符串和文件。
数字:
1.运算符 说明
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
2.字符串:
判断符 说明
-n STRING 字符串长度不为零
-z STRING 字符串长度为0
= 判断两个字符串是否一样
!= 判断两个字符串是否不一样
3.文件
判断符 说明
-f 存在且是普通文件
-d 存在且是目录
-h 存在且是符号链接
-e 文件存在
–r 文件存在并且可读
–w 文件存在并且可写
–x 文件存在并且可执行
if 语句
if 语句语法格式:
if condition
then
command1
command2
...
commandN
fi
案例:
1)判断当前系统是否有多个ssh进程,如果有则打印true
### 测试脚本
#!/bin/bash
if [ $(ps -ef |grep ssh |wc -l) -gt 1 ]
then
echo "true"
fi
###执行脚本
[root@localhost shell2]# sh if1.sh
true
也可以用:grep -c 用来统计字符串出现的次数
2)判断/media/cdrom目录是否存在,若不存在就去创建这个目录
###测试代码
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
###执行脚本 创建成功
if else
if else 语法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
案例:
1) 根据年龄判断是否成年
###测试代码
#!/bin/bash
echo "请输入您的年龄:"
read age
if [ $age -ge 18 ] ##前后空格
then
echo "您成年啦!!!!"
else
echo "您未成年!!!!!"
fi
### 执行代码
[root@localhost shell2]# sh if3.sh
请输入您的年龄:
23
您成年啦!!!!
if else语句经常与test命令结合使用
1. test 命令允许你做各种测试并在测试成功或失败时返回它的退出状态码
(为0表示为真,为1表示为假)。使用这个状态码,可以让 Bash
对测试的结果做出反应。
2. test 命令的语法为:
test EXPRESSION
或
[ EXPRESSION ]
案例:
1) 判断两个数是否相等
### 测试代码
#!/bin/bash
num1=$[3*4]
num2=$[12*2]
if test $num1 -eq $num2
then
echo "两个数相等"
else
echo "两个数不相等"
fi
### 执行代码
[root@localhost shell2]# sh if4.sh
两个数不相等
if else-if else
if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
案例:
1) 输入成绩,判断成绩“优”“良”“中”
###测试代码
#!/bin/bash
echo "请输入您的成绩:"
read scare #类似Java中的Scanner 从键盘输入
if [ $scare -ge 85 ] && [ $scare -le 100 ]
then
echo "优秀"
elif [ $scare -ge 70 ] && [ $scare -le 85 ]
then
echo "良"
elif [ $scare -ge 60 ] && [ $scare -le 70 ]
then
echo "中"
else
echo "差"
fi
### 执行结果
[root@localhost shell2]# sh if5.sh
请输入您的成绩:
85
优秀
[root@localhost shell2]# sh if5.sh
请输入您的成绩:
50
差
[root@localhost shell2]# sh if5.sh
请输入您的成绩:
99
优秀
for循环语句
与其他编程语言类似,Shell支持for循环。
格式1-字符型循环
for循环一般格式为:
for 变量 in 值1 值2 值3…
do
程序
done
当变量值在列表里,for循环即执行一次所有命令,使用变量名获
取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。
in列表是可选的,如果不用它,for循环使用命令行的位置参数。
案例:
1) 顺序输出遍历数字
### 测试代码
#!/bin/bash
for afu01 in 1 2 3 4 5
do
echo "遍历顺序输出结果为:$afu01"
done
### 执行结果
[root@afu01 shell2]# sh for1.sh
遍历顺序输出结果为:1
遍历顺序输出结果为:2
遍历顺序输出结果为:3
遍历顺序输出结果为:4
遍历顺序输出结果为:5
2) 打印/root目录下所有文件的名字
### 测试代码
#!/bin/bash
for file in $(ls /root)
do
echo "$file"
done
### 执行结果
[root@afu01 shell2]# sh for2.sh
anaconda-ks.cfg
initial-setup-ks.cfg
公共
模板
视频
图片
文档
下载
音乐
桌面
格式2-数字性循环
该格式的语法如下:
for ((初始值;循环控制条件;变量变化))
do
程序
done
需要注意以下几点:
初始值:在循环开始时,需要给某个变量赋予初始值,如 i=1。
循环控制条件:用于指定变量循环的次数,如 i<=100,则只要 i 的
值小于等于 100,循环就会继续。
变量变化:每次循环之后,变量该如何变化,如 i=i+1,代表每次
循环之后,变量的值都加 1。
语法二和其他语言中的 for 循环类似,也就是事先决定循环次数的固定循环。
案例:
1) 求 1 - 100 的和
### 测试代码
#!/bin/bash
sum=0 #定义一个计数器 计数求和
for ((i = 0; i <=100; i++)) #1 加 到 100
do
#循环赋值
sum=$(($sum+$i))
done
#输出
echo "1 - 100的和为: $sum"
### 执行结果
[root@afu01 shell2]# sh for3.sh
1 - 100的和为: 5050
while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while 条件
do
程序
done
案例:
1) 以下是一个基本的while循环,测试条件是:如果int小于等于5,
那么条件返回真。int从0开始,每次循环处理时,int加1。
运行上述脚本,返回数字1到5,然后终止。
### 测试脚本
#!/bin/bash
num=1
while [ $num -le 5 ]
do
echo $num
let num++
done
### 执行脚本
运行脚本,输出:
1
2
3
4
5
使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令。
2) 求 1 -100 的和
### 测试代码
#!/bin/bash
i=1
num=0
while [ $i -le 100 ]
do
let num=num+i
let i++ #程序 let 是一个运算符号 可以让我们省略 $
done
echo "和为:$num"
###执行代码
[root@afu01 shell2]# sh while2.sh
和为:5050
case语句
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 变量 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示。取值后面必须为单词in,每一模式必须以
右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式
后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完
匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用
星号 * 捕获该值,再执行后面的命令。
案例:
1) 输入1到4,与1,2,3,4,其他 每一种模式进行匹配:
###测试代码
#!/bin/bash
echo "请输入 1 到 4 之间的数字"
echo "你输入的数字为:"
read num
case $num in
1) echo "你选择了1"
;;
2) echo "你选择了2"
;;
3) echo "你选择了3"
;;
4) echo "你选择了4"
;;
*) echo "你输入的值不在范围"
;;
esac
### 执行代码
[root@afu01 shell2]# sh case1.sh
请输入 1 到 4 之间的数字
你输入的数字为:
4
你选择了4
[root@afu01 shell2]# sh case1.sh
请输入 1 到 4 之间的数字
你输入的数字为:
88
你输入的值不在范围
输入不同的内容,会有不同的结果
跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令允许跳出所有循环(终止执行后面的所有循环)。
案例:
1) 脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。
###测试代码
#!/bin/bash
while :
do
echo -n "请输入 1 - 5之间的数字:"
read num
case $num in
1|2|3|4|5) echo "你输入的数字为: $num"
;;
*) echo "你输入的数字不在范围...."
break
;;
esac
done
### 执行结果
[root@afu01 shell2]# sh break.sh
请输入 1 - 5之间的数字:4
你输入的数字为: 4
请输入 1 - 5之间的数字:3
你输入的数字为: 3
请输入 1 - 5之间的数字:9
你输入的数字不在范围....
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
### 测试代码
while :
do
echo -n "请输入1 - 5 之间的数字"
read num
case $num in
1|2|3|4|5) echo "你输入的数字为: $num"
;;
*) echo "你输入的数字不在范围内"
continue
echo "游戏结束"
esac
done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句
echo "**游戏结束"** 永远不会被执行。