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
一、单分支
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 0
- shell学习十三--分支与循环
- 汇编学习-分支与循环
- 7.shell分支与循环结构
- Shell脚本编程-分支与循环
- unix shell编程(读书笔记2):分支与循环
- 十三.创建与合并分支
- 分支判断与循环
- 分支与循环
- Java分支与循环
- shell十三问之16:学习总结与原帖目录
- javascript学习系列03(分支判断与循环)
- Python学习之[2]——变量、分支与循环
- Python学习随笔三:判断分支与循环语句
- shell基础(输入参数、分支、循环)
- shell基础 (输入参数、分支、循环)
- linux shell 初学 变量 循环 分支
- Shell编程---分支和循环结构
- 《shell十三问》学习笔记
- Mybatis一对一查询与插入
- java学习笔记1
- NOI-OJ逆波兰表达式
- mybatis加jdbctype,jdbctype和javatype区别mybatis插入insert空指针无效字符
- HDU 3466|Proud Merchants|01背包|贪心
- shell学习十三--分支与循环
- Luogu 1979(BFS+SPFA)
- 详解比较好的音视频通话SDK开发包的技术要点
- 欢迎使用CSDN-markdown编辑器
- java发送邮件封装类
- 架构师四十八个阶段高端课
- Java PIO读取Excel文件
- java中函数是值传递还是引用传递?
- Apache的DBUtils框架学习