您的位置:首页 > 运维架构 > Shell

shell学习十三--分支与循环

2017-09-18 23:52 459 查看
分支与循环

一、单分支

if 语句格式

if  条件

then

 Command

fi      



if[command];then if  这里的分号相当于换行

 函数

then

上面两种语法等同

特殊写法:if[ -f "$file1" ];then echo 1 相当于:[ -f "$file1" ]&&echo 1

例子1:判断目录和文件是否存在,如果不存在添加

[root@node01 day5]# cat if1.sh

#!/bin/bash

path=/server/scripts

file=file3.sh

#no1

if [ ! -d $path ]

   then

      mkdir -p $path

      echo "$path is not exits,already create."

fi

#no2

if [ ! -f $path/$file ]

   then

      touch $path/$file

      echo "$path/$file is not exits,already create."

      exit

fi

#no3

ls -l $path/$file

[root@node01 day5]# sh if1.sh

/server/scripts is not exits,already create.

/server/scripts/file3.sh is not exits,already create.

-rw-r--r-- 1 root root 0 Jul 31 15:21 /server/scripts/file3.sh

[root@node01 day5]# sh if1.sh

-rw-r--r-- 1 root root 0 Jul 31 15:21 /server/scripts/file3.sh

例子2:开发监控内存脚本,小于100m报警

[root@node01 day5]# free -m|grep buffers/|awk '{print $4}'

704

[root@node01 day5]# free -m|grep buffers/|awk '{print $NF}'   NF到着取

704

[root@node01 day5]# free -m|grep buffers/|awk '{print $(NF-1)}'  $(NF-1)倒着取

276

[root@node01 day5]# free -m|awk 'NR==3{print $(NF-1)}'              

276

[root@node01 day5]# free -m|awk 'NR==3{print $NF}'    

704

[root@node01 day5]#

[root@node01 day5]# vi check_mem.sh

#!/bin/bash

used_mem=`free -m|awk 'NR==3{print $NF}' `

if [ $used_mem -lt 900 ]

   then

     echo "mem is not enough,$used_mem."

     echo "mem is not enough,$used_mem."|mail -s "mem warning $(date +%F)" 1098331428@qq.com

fi

[root@node01 day5]# crontab -e

no crontab for root - using an empty one

###########

*/3 * * * *  /bin/sh /data/day5/check_mem.sh

二、双分支

if  条件

then

 Command

else

 Command

fi    

三、多分支

if  条件

then

 Command

elif 条件

then

 Command

 。。。。

fi 

if  条件

then

 Command

elif 条件

then

 Command

 。。。。

elif 条件

then

 Command

 。。。。

 

fi

例子3:双分支if条件语句命令行传参方式比较两个整数大小

[root@node01 day5]# vi if2.sh    

#!/bin/sh

a=$1

b=$2

if [ $a -lt $b ]

  then

    echo "$a>$b"

elif  [ $a -eq $b ]

   then

    echo "$a=$b"

else

    echo "$a<$b"

fi

exit 0

[root@node01 day5]# sh if2.sh 2 3

2>3

[root@node01 day5]# sh if2.sh 3 3

3=3

[root@node01 day5]# sh if2.sh 3 4

3>4

[root@node01 day5]# sh if2.sh 3 f

if2.sh: line 5: [: f: integer expression expected

if2.sh: line 8: [: f: integer expression expected

3<f

利用read

[root@node01 day5]# vi if3.sh 

#!/bin/sh

read -p "Pls input two number:" a b

#no1

[ -z "$a" ] || [ -z "$b" ] && {

echo "Pls input two num again."

exit 1

}

#no2

expr $a + 10 &>/dev/null

RETVAL1=$?

expr $b + 10 &>/dev/null

RETVAL2=$?

test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ||{

  echo "Pls input two no again."

  exit 2

}

#no3

if [ $a -lt $b ]

  then

    echo "$a>$b"

elif  [ $a -eq $b ]

   then

    echo "$a=$b"

else

    echo "$a<$b"

fi

exit 0

~                

例子4:判断整数

#!/bin/bash        

 方法1

a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] && echo string a is numbers   

第一个-n是shell的测试标志,对后面的串"`sed -n '/^[0-9][0-9]*$/p'`" 进行测试,如果非空,则结果为真。    

sed默认会显示所有输入行信息的,sed的“-n”选项是让sed不要显示,而只显示我们所需要的内容:即后面的表达

式所匹配的行,这是通过表达式中加入“p”命令来实现的。   /^[0-9][0-9]*$/他的含义是匹配至少由一位数字构成的行      

 方法2, 

可以,不过不是bash实现的,是使用了grep的正则  

if grep '^[[:digit:]]*$' <<< "$1";then  

  echo "$1 is number."  

  else  

  echo 'no.'  

  fi       

  

方法3  

if [ "$1" -gt 0 ] 2>/dev/null ;then  

  echo "$1 is number."  

  else  #  echo 'no.' 

  fi       

  

方法4,case  

case "$1" in  

  [1-9][0-9]*)   

      echo "$1 is number."

      ;;  

    *)   

      ;;  

  esac      

方法5 awk  

echo $1| awk '{print($0~/^[-]?([0-9])+[.]?([0-9])+$/)?"number":"string"}'       

## 方法5,awk  

if [ -n "$(echo $1| sed -n "/^[0-9]\+$/p")" ];then  #  echo "$1 is number."  

else  

  echo 'no.'  

fi        

方法6,expr    (推荐使用)

expr $1 "+" 10 &> /dev/null 

if [ $? -eq 0 ];then   

echo "$1 is number" 

else   

echo "$1 not number" 

fi 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: