Shell编程(三)

控制流结构

简介:控制结构 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
注:在whiledo之间虽然通常是一个命令,但可以放几个命令。
命令通常用作测试条件。
练习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

猜你喜欢

转载自blog.csdn.net/coolwriter/article/details/80228739