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

前端之家收集整理的这篇文章主要介绍了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

猜你在找的Bash相关文章