1-23-shell脚本之-if流程控制语句和for循环语句的使用
大纲:
1、逻辑判断
2、if流程控制语句
3、for循环控制语句
----------------------------------------------
在开始之前,先了解一下逻辑判断符号:
&& 与、|| 或、! 非
A && B 必须A,B同时成立,才能通过判断
---> 判断流程:先执行A判断其是否成立,若成立,则继续执行B,判断其是否成立
---> 若不成立,则直接结束,不再执行B
A || B A、B有一个成立,即可通过判断
!A 若A不成立,则通过判断
----------------------------------------------
----------------------------------------------
在条件判断时,那面会比较数值或字符串,这是我们会用到一些参数和符号,如下:
比较数值:
等于 ---> –eq
不等于 ---> –ne
小于 ---> –lt
大于 ---> –gt
小于等于 ---> –le
大于等于 ---> –ge
一些英文单词:帮助记忆
equal等于、not equal、less than、great than
比较字符串:
= 等于、== 等于,同=、!= 不等于、> 大于、<小于、-z字符串为空、-n字符串非空null
注意:在[]结构中,<和>需要使用转义符号,如下图
实战1:判断当前系统语言环境
[root@xiaogan 02]# echo $LANG
en_US.UTF-8
[root@xiaogan 02]# echo $LANG | awk -F . '{print $1}'
en_US
[root@xiaogan 02]# vim lang.sh
[root@xiaogan 02]# sh -x lang.sh
++ echo en_US.UTF-8
++ awk -F . '{print $1}'
+ language=en_US
+ '[' en_US = en_US ']'
+ echo 'The Default Language is English.'
The Default Language is English.
[root@xiaogan 02]# cat lang.sh
#!/bin/bash
# judged if the System Default Language is English
language=$(echo $LANG | awk -F . '{print $1}')
if
[ $language = 'en_US' ]
then echo "The Default Language is English."
else echo "You are wrong!"
fi
[root@xiaogan 02]#
----------------------------------------------
if流程控制语句
if语句有三种使用方式:
格式如下:
单分支:
if 条件判断语句
then 执行语句
fi
双分支:
if 条件判断语句
then 执行语句
else 执行语句
fi
多分支:
if 条件判断语句
then 执行语句
else 执行语句
fi
##################################
实战1:if单分支--->应用
源码如下:
#!/bin/bash
# if
# then
# fi
if [ ! -d /root/cdrom ]
then echo "/root/cdrom is not exist!"
fi
##################################
实战2:if双分支应用--->pinghost.sh
ping -c 3 -i 0.2 -w 3 192.168.0.1
-c 发送数据包个数
-i 数据包每次发送间隔时间,默认单位:秒(s)
-w 等待时间,超过返回失败
源码如下:
#!/bin/bash
# ping a given host and print the host status
ping -c 3 -i 0.2 -w 3 $1 >>/dev/null #-c count -i -w wait
if [ $? -eq 0 ]
then echo "the host $1 is up."
else echo "the host $1 is down."
fi
##################################
实战3:if多分支应用--->判断数值区间 num_where.sh
源码如下:
#!/bin/bash
# judged the input score
read -p "input you score(0-100):" num
if [ $num -gt 85 ] && [ $num -lt 100 ]
then echo "Great! Good Good Study!!"
else echo "Day Day Up!"
fi
##################################
实战4:if嵌套使用
编写脚本,监控服务运行状态,
启动失败后,保存日志,并重启服务,
再次失败,提示重启主机
源码如下:
#!/bin/bash
systemctl status $1 >>/var/log/ser.log
if [ $? -eq 0 ]
then echo "the $1 is running."
else echo "the $1 is dead."
systemctl start $1 >>/dev/null
if [ $? -eq 0 ]
then echo "Reboot finish!"
systemctl restart $1
else echo "Warnning You to Reboot your server!"
fi
fi
##################################
实战5:查询内核版本,并输出信息
源码如下;
#!/bin/bash
# search the major version of System, and print info.
prime=$(uname -r | awk -F . '{ print $1}')
if [ $prime -gt 2 ]
then echo "The major version of System is $prime."
elif [ $prime -lt 1 ]
then echo "The System is too low."
else echo "Failed!"
fi
----------------------------------------------
for循环控制语句
用法:
for 变量名 in 变量遍历列表
do
循环语句
done #循环结束表示
##################################
实战:用户管理(批量添加用户)
方法一:
运行环境:
输出结果:
批量删除用户:
方法一优化:
我们发现,在用方法一批量添加用户是,当用户不存在时,会有报错信息。查看运行过程如下:
sh –x for01_useradd.sh
在进入循环后,我们会首先查找/etc/passwd下,是否已存在用户$user,
但是,在运行过程中,我们发现,当这个用户不存在时user_a数值为空,判断条件就会少了一个比较值,而造成判断条件变为:[ = xiaogan ],这是系统就会报错!
为了避免系统报错,我们可使用-z 或 -n选项来判断user_a变量是否为空。
执行结果如下:
方法二:我们也可以采取另外一种方法,来批量添加用户
各方法源码如下:
方法一:
#useradd.sh
#!/bin/bash
userlist=$( cat user.list )
for user in $userlist
do
user_a=$(grep -w "$user" /etc/passwd | awk -F : '{print $1}' )
if
[ $user_a = $user ]
then
echo "The user $user is already exist."
else
useradd $user #2>>/dev/null
echo "User $user is added."
fi
done
###########
#userdel.sh
#!/bin/bash
userlist=$( cat user.list )
for user in $userlist
do
userdel -r $user 2>>/dev/null
if [ $? = 0 ]
then
echo "The user $user is deleted!"
fi
done
优化:
#useradd.sh
#!/bin/bash
userlist=$( cat user.list )
for user in $userlist
do
user_a=$(grep -w "$user" /etc/passwd | awk -F : '{print $1}' )
if
# [ $user_a = $user ]
[ ! $user_a -z ] && [ $user_a = $user ]
# To determine whether user_a is empty, not empty in to continue
then
echo "The user $user is already exist."
else
useradd $user #2>>/dev/null
echo "User $user is added."
fi
done
方法二:
#new useradd.sh
#!/bin/bash
# Batch add user by scripts
# the new method
userlist=$( cat user.list )
for user in $userlist
do
useradd $user 2>>/dev/null
if
[ $? -eq 0 ]
then
echo "123456" | passwd --stdin $user >> /dev/null
echo "Useradd Success!"
else
echo "The user $user is already exists."
fi
done
##################################
实战:ping.sh #批量测试IP地址是否连通
源码如下:
#!/bin/bash
ip_list=$( cat ip.list )
for ip in $ip_list
do
ping -w 3 -c 3 -i 0.2 $ip >>/dev/null
if [ $? -eq 0 ]
then echo "the $ip is up."
else echo "the $ip is down."
fi
done
1-23-shell脚本之-if流程控制语句和for循环语句的使用的更多相关文章
- 『无为则无心』Python基础 — 14、Python流程控制语句(while循环语句)
目录 1.什么是循环结构 2.while循环 (1)while循环的语法 (2)while循环的应用 3.while语句的死循环 4.break和continue 5.while循环嵌套 (1)应用场 ...
- 『无为则无心』Python基础 — 15、Python流程控制语句(for循环语句)
目录 1.for循环语法 2.for循环中的break和continue 3.循环+else结构 (1)while...else (2)while...else退出循环的方式 (3)for...els ...
- shell脚本实现监控shell脚本的执行流程及变量的值
这篇文章主要介绍了shell脚本实现监控shell脚本的执行流程及变量的值本文使用shell完成对执行过程中条件语句中的变量的变化的监控和整个程序的执行流程的观察功能,需要的朋友可以参考下 很多时候, ...
- Shell脚本编写4-----Shell 流程控制
没啥好说的,直接从demo里看吧!(1) if 语句shell脚本的if语句格式如下: 判断输入两个参数的大小,执行结果如下 (2)for 循环for循环语法格式如下: 执行结果如下 (3)while ...
- Python基础2:流程控制语句 while / for循环
[ while 循环 ] 如果要计算1+2+3,我们可以直接写表达式: >>> 1 + 2 + 3 要计算1+2+3+...+10,勉强也能写出来. 但是,要计算1+2+3+...+ ...
- 在shell脚本中进行条件控制以及使用循环
转载请标明:http://www.cnblogs.com/winifred-tang94/ if条件语句语法: if [ 条件表达式 ] then 代码 else 代码 fi 注意:在上面的if条件语 ...
- JavaScript基础&实战(3)js中的流程控制语句、条件分支语句、for循环、while循环
文章目录 1.流程控制语句 1.1 代码 1.2 测试结果 2.弹窗提示输入内容 2.1 代码 2.2 测试结果 3.条件分支语句 3.1 代码 3.2 测试结果 4.while和 do...whil ...
- 1-24-case流程控制和while循环语句的使用
大纲: 1.while循环控制语句 while实战---批量添加规则用户 while实战---猜价格游戏 2.case流程控制语句和exit退出 exit实战---返回值测试 case实战---智能解 ...
- Shell脚本[运算表达式,条件控制语句]
#!/bin/bash #你值得收藏的四则表达式运算. val1=1 val2=1 val3=1 val4=1 val5=1 val6=1 val7=1 let val1++ ((val2++)) v ...
随机推荐
- 执行Java脚本firefox启动成功,不运行test方法,且提示NullPointerException
在ideal中新建maven项目,将录制好的Java脚本文件,直接复制到项目中,添加相关的依赖脚本. 代码不报错之后,运行录制好的Java脚本,启动了firefox之后,不执行test方法,报错Nul ...
- MySQL,sqlalchemy
Mariadb 数据库是一堆表的集合 主键 外键 索引 安装: Centos7 [root@host]# mysqladmin -u root password "new_password& ...
- mysql数据库从删库到跑路之mysql表操作
表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 内容: 1 创建表 ...
- C++切割字符串
std::string text = "2001_1;2005_5;"; std::stringstream ss(text); std::string sub_str; std: ...
- iOS开发之HelloKit代码片段
完整代码托管:https://github.com/1042710553/HelloKit.git /************************/plist/****************** ...
- 【Python】错误、调试和测试
链接到错误处理 链接到调试 链接到单元测试 链接到文档测试 [错误处理] 小结:遇到错误怎么办? 1.不理它. 2.捕获它,再抛出. 3.捕获并处理错误. raise 不懂如何处理错误就直接抛出(ra ...
- Java-性能调优工具-jstat
jps 查看当前java进程 [ ~]# jps 9939 Resin 9874 WatchdogManager 18293 Jps jstat -gc -t pid 1s [ ~]# jstat - ...
- 第三周JAVA程序设计基础学习总结
20145322学号 <Java程序设计>第3周学习总结 ## 教材学习内容总结 之前第三章说过Java中主要有基本类型和类类型两种类型系统,第四章主要谈类类型. 类定义时使用class关 ...
- 20145328 《Java程序设计》第3周学习总结
20145328 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 对象Object:存在的具体实体,具有明确的状态和行为 类Class:具有相同属性和行为的一组对象的集合,用 ...
- Docker storage drivers
因为Docker的镜像是分层的,包含只读层和可读写层,因此选择正确的Storage Driver对于容器的性能是非常重要的. 支持的Linux发行版本 目前推荐使用性能最好的Overlay2.RHEL ...