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

分支与循环

一、单分支

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 





























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值