2.5 流程控制
2.5.1 if语法
1、语法格式
ifcondition
then
statements
[elifcondition
thenstatements...]
[else
statements]
fi
2、示例
脚本内容截图:
3、判断条件
1/ 条件判断基本语法
[ condition ](注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
[ itcast ]
#空返回false
[ ]
注意[ ]内部的=周边的空格,有区别:
短路(理解为三元运算符)
[ condition ] && echo OK || echonotok
条件满足,执行&&后面的语句;条件不满足,执行|| 后面的语句
2/ 条件判断组合
注:[] 与[[ ]] 的区别:[[ ]] 中逻辑组合可以使用 && || 符号
而[] 里面逻辑组合可以用 -a -o
3/ 常用判断运算符
字符串比较:= !=
-z 字符串长度是为0返回true
-n 字符串长度是不为0返回true
if [ 'aa' = 'bb' ]; then echo ok; else echonotok;fi
if [ -n "aa" ]; then echo ok;else echo notok;fi
if [ -z "" ]; then echo ok; elseecho notok;fi
整数比较:
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
文件判断:
-d 是否为目录
if [ -d /bin ]; then echo ok; else echonotok;fi
-f 是否为文件
if [ -f /bin/ls ]; then echo ok; elseecho notok;fi
-e 是否存在
if [ -e /bin/ls ]; then echo ok; elseecho notok;fi
2.5.2 while语法
1、方式一
while expression
do
command
…
done
2、方式二
i=1
while ((i<=3))
do
echo $i
leti++
done
while.sh脚本的内容如下:
while2.sh的脚本内容如下:
2.5.3 case语法
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常量。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令不再继续其他模式。如果无一匹配模式,使用星号*捕获该值,再执行后面的命令。
下面的脚本提示输入1到4,与每一种模式进行匹配:
case.sh案例如下:
运行结果:
再如例子case2.sh
运行结果:
2.5.4 for语法
1、方式一
或
再如如下例子:
通过shell来统一放开端口
再如例子:
第一类:数字型循环
#!/bin/bashfor((i=1;i<=10;i++));do echo $(expr $i \* 3 + 1);done
#!/bin/bashfor i in $(seq 1 10)do echo $(expr $i \* 3 + 1);done
#!/bin/bashfor i in {1..10}doecho $(expr $i \* 3 + 1);done
#!/bin/bashawk 'BEGIN{for(i=1; i<=10; i++) print i}'
第二类:字符型循环
#!/bin/bashfor i in `ls`;do echo $i is file name\! ;done
#!/bin/bashfor i in $* ;doecho $i is input chart\! ;
#!/bin/bashfor i in f1 f2 f3 ;doecho $i is appoint ;done
#!/bin/bashlist="rootfs usr data data2"for i in $list;doecho $i is appoint ;done
第三类:路径查找
#!/bin/bashfor file in /proc/*;doecho $file is file path \! ;done
#!/bin/bashfor file in $(ls *.sh)doecho $file is file path \! ;done
判断文件是否存在
#shell判断文件夹是否存在#如果文件夹不存在,创建文件夹if [ ! -d "/Top" ]; thenmkdir -p /Topfi#shell判断文件,目录是否存在或者具有权限folder="/Top"file="/Top/test.txt"# -x 参数判断 $folder 是否存在并且是否具有可执行权限if [ ! -x "$folder"]; thenmkdir "$folder"fi# -d 参数判断 $folder 是否存在if [ ! -d "$folder"]; thenmkdir "$folder"fi# -f 参数判断 $file 是否存在,加!表示不存在if [ ! -f "$file" ]; thentouch "$file"fi# -n 判断一个"变量"是否有值if [ ! -n "$file" ]; thenecho "$file 变量为空!"exit 0fi# 判断两个变量的字符串内容是否相同if [ "$file1" = "$file2" ]; thenecho "$file1 equal $file2"elseecho "$file1 not equal $file2"fi
代码实现二:
#!/bin/sh# 说明:判断文件是否存在myPath="/Top"myFile="/Top/access.log"# 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限if [ ! -x "$myPath"]; thenmkdir "$myPath"fi# 这里的-d 参数判断$myPath是否存在if [ ! -d "$myPath"]; thenmkdir "$myPath"fi# 这里的-f参数判断$myFile是否存在if [ ! -f "$myFile" ]; thentouch "$myFile"fi# 其他参数还有-n,-n是判断一个变量是否是否有值if [ ! -n "$myVar" ]; thenecho "$myVar 变量为空!"exit 0fi# 判断$file字符串内容是否是“123123”相同if [ "$file1" = "123123" ]; thenecho "$file1 equal $file2"elseecho "$file1 not equal $file2"fi
2、方式二
for ((i = 0; i <= 5; i++))
do
echo"welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo"welcome $i times"; done
定义for2.sh
2.5.5.跳出循环
在循环过程中,有时候需要在未达到循环结束条件时跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令
break命令允许跳出所有循环(终止执行后面的所有循环)
下面的例子中,脚本进入死循环直到用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break名。
执行以上的代码,输入结果为:
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。对上面的例子进行修改:
运行代码,结果如下: