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

来源:互联网 发布:ubuntu下载镜像方法 编辑:程序博客网 时间:2024/05/18 18:54
分支与循环

一、单分支

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