控制流结构
简介:控制结构 if then else语句 case语句 for循环 until循环
while循环 break控制 confinue控制
流控制是什么
#!/bin/bash
#创建一个目录
make /home/wbm/shell/txt
#复制所有txt文件到指定目录
cp *.txt /home/wbm/shell/txt
rm -f *txt
上述脚本会出现问题吗?
如果目录创建失败或成功如何处理
文件拷贝失败如何处理
条件测试
有时判断字符串是否相等或检查文件状态或是数字测试等。Test命令用于测试字符串,文件状态和数字。
一、文件状态测试
格式 test condition 或 [ condition ]
使用方括号时,要注意在条件两边加上空格。
文件测试状态 :测试的结果可以用$?的值来判断,0表示成功,其他为失败
-d 目录 -s 文件长度大于0、非空
-f 正规文件 -w 可写
-L 符号链接 -u 文件有suid位设置
-r 可读 -x 可执行
-z 字符串为空
脚本测试
[wbm@wmblinux64 041]$ ls
01test.sh 1 iftest.sh
[wbm@wmblinux64 041]$ test -d dir
[wbm@wmblinux64 041]$ echo $?
脚本练习:
#!/bin/bash
echo "test use 1"
test -w tmp.txt
echo $?
echo "test use 2 [] begin"
[ -w tmp.txt ]
echo $?
对上面bash进行if控制
#!/bin/bash
echo "test use 1"
test -w tmp.txt
if [ $? -eq "0" ]; then
echo "success \n";
else
echo "net success";
fi
echo $?
echo "test use 2 [] begin"
[ -w tmp.txt ]
echo $?
要测试其他的类似.
测试时使用逻辑操作符
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
下面的例子测试两个文件xaa和xab是否均可读.
二、 字符串测试
使用方括号时,要注意在条件两边加上空格。
测试两个字符是否相等。退出状态变量 $?,0表示成功,1表示失败。
操作数string_operator
= 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串
练习1:测试环节变量是否为空
练习2:测试字符串是否相等
三、测试数值
格式 测试两个数值大小
“number” numberic_operator “number”
或者
[ “number” numberic_operator “number” ]
numberic_operator可为:
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
四、expr数字运算
加法运算:expr 10 + 10
减法运算:expr 20 - 10
加法运算:expr 10 / 5
乘法运算:expr 10 * 5
如果是非数字参加运算会报错误,利用此点可以用来测试数字格式。
root@localhost opt]# if expr a + 100; then echo aaaa; else echo bbbb; fi;
expr: non-numeric argument
bbbb
没有达到预期效果:而且使用乘号时也要用反斜线屏蔽其特殊意义
判断语句
一、if else
语法1
if 条件
then 命令
fi
注意if语句必须以fi终止
练习:
#if test
if [ "13" -lt "12" ] # "13" 前一个空格,“13”后也有一个空格。
then
echo "yes 13 is less then 12"
else
echo "NO"
fi
语法2
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令3
Fi
综合练习
#!/bin/bash
#if test
#this is a comment line
echo "Enter your filename:"
read myfile
if [ -e $myfile ]
then
if [ -s $myfile ];then
echo "$myfile exist and size greater than zero"
else
echo "$myfile exist but size is zero"
fi
else
echo "file no exist"
fi
二、case多选择语句
case多选择语句格式:
case 值 in
模式1)
命令1
;;
模式2)
命令2
;;
esac
1)case取值后面必须为单词in;每一模式必须以右括号结束。
2)取值可以为变量或常数。匹配发现取值符合某一模式后,其后的所有命令开始执行,直到;;
3)模式匹配*表示任意字符; ?表示任意单字符; [..]表示类或范围中任意字符
练习:
#!/bin/bash
#case select
echo -n "enter a number from 1 to 3:"
read num
case $num in
1)
echo "you select 1"
;;
2)
echo "you select 2"
;;
3)
echo "you select 3"
;;
y|Y)
echo “you select y”
;;
*)
echo "`basename $0`:this is not between 1 and 3">&2
exit;
;;
esac
三、for循环
语法格式:
for循环一般格式
for 变量名 in 列表
do
命令1
命令2
done
1 当变量值在列表里,for循环即执行依次所有命令,使用变量名访问列表中取值。
2 命令可为任何有效的shell命令和语句。变量名为任意单词。
3 in列表用法是可选择,如果不用它,for循环使用命令行的位置参数。
4 in列表可以包含替换、字符串和文件名
练习:1
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
练习:2
#!/bin/bash
for i in "aaa bbb ccc "
do
echo $i
done
echo "你看出来效果不一样了吗"
for i in aaa bbb ccc
do
echo $i
done
练习3 注意 in后为 命令 反引号
#!/bin/bash
for i in `cat myfile`
do
echo $i
done
注意:打印文件内容按照 行+空格 为一行
练习4:如果in后没有语句,此时语句等价于: in $@
#!/bin/bash
#for_noin03.sh
i=1
for param
do
echo "param #$I is $param"
i=$i+1
done
测试:[wbm@wmblinux64 041]$ ./for_noin03.sh aa bbb ccc
四、until循环
语法
until循环格式
until 条件
do
命令1
命令2
done
条件可以为任意测试条件,测试发生在循环末尾,因此循环至少执行一次。
练习:
#!/bin/sh
#until_mom 监控分区
Part="/backup"
Look_Out=`df | grep "$Part" | awk '{printf $5}' | sed 's/%//g' `
echo $Look_Out;
until [ "$Look_Out" -gt "90" ]
do
echo -e "Filesystem $Part is nearly full " | mail root
Look_Out=`df | grep "$Part" | awk '{printf $5}' | sed 's/%//g' `
sleep 3600
done
练习2:
#!/bin/bash
#until_mom 枷锁文件
until [ ! -f a.lock ]
do
echo "check a.lock exist"
sleep 2
done
echo "you may start another application safely"
执行:nohup ./until02.sh &
五、while循环
语法
while 命令 (可以是一个命令也可以是多个,做条件测试)
do
命令1
命令2
...
done
注:在while和do之间虽然通常是一个命令,但可以放几个命令。
命令通常用作测试条件。
练习1:
[wbm@wmblinux64 041]$ vi while01.sh
#!/bin/bash
#while01
echo "ctrl+d quit"
while echo -n "please enter you name:"; read Name
do
echo "Yeah, you name: $Name";
done
练习2:从文件中按照行读数据
#!/bin/bash
#while02
while read LINE
do
echo $LINE
done < names.txt
#!/bin/bash
#while02
#这样写是不对的 ,需要把<name.txt 放在 while循环后面
while read LINE < names.txt
do
echo $LINE
done
备注:如果从文件中读入变量<filename要放到done后
六、break和continue
break [n]
退出循环
如果是在一个嵌入循环里,可以指定n来跳出循环个数
continue
跳出循环步
注意:continue命令类似于break命令,只有一点重要差别,它不会跳出循环,只是跳出这个循环步
总结:break跳出 continue跳过
#!/bin/bash
#breakout
while :
do
echo -n "Enter any num[1...5]:"
read num
case $num in
1|2|3|4|5)
echo "You enter a num between 1 and 5"
;;
*)
echo "Wrong num, bye"
break;
;;
esac
done
#!/bin/bash
#breakout
while :
do
echo -n "Enter any num[1...5]:"
read num
case $num in
1|2|3|4|5)
echo "You enter a num between 1 and 5"
;;
*)
echo -n "Wrong num, continue (y/n)?: "
read IS_CONTINUE
case $IS_CONTINUE in
y|yes|Yes)
continue
;;
*)
break;
;;
esac
esac
done