分支与循环
一、单分支
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
一、单分支
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