Shell流程语句
1. shell流程控制
流程控制是改变程序运行顺序的指令。linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。
2. if语句
格式:if list; then list; [ elif list; then list; ] ... [ else list; ] fi
2.1 单分支
if 条件表达式; then
命令
fi
[root@localhost ~]# vim test.sh
#!/bin/bash
if [ -eq ];then
echo "yes"
fi
[root@localhost ~]# bash test.sh
yes
2.2 双分支
if 条件表达式; then
命令
else
命令
fi
#!/bin/bash
if [ -eq ];then
echo "yes"
else
echo "no"
fi
[root@localhost ~]# bash -x test.sh #-x,调试
+ '[' -eq ']'
+ echo no
no
#判断crond进程是否正在运行
[root@localhost ~]# ps aux | grep "grep"
root 0.0 0.0 pts/ S+ : : grep --color=auto
[root@localhost ~]#vim cron_d.sh
#!/bin/bash
NAME=crond
NUM=$(ps aux | grep $NAME | grep -vc grep)
if [ $NUM -eq ]; then
echo "$NAME running."
else
echo "$NAME is not running!"
fi
#检查主机是否在线
#!/bin/bash
if ping -c 192.168.1.1 &>/dev/null; then #if可以直接对命令进行判断
echo "OK."
else
echo "NO!"
fi
2.3 多分支
if 条件表达式; then
命令
elif 条件表达式; then
命令
else
命令
fi
#!/bin/bash
N=$ # 接收用户输入参数
if [ $N -eq ]; then
echo "eq 3"
elif [ $N -eq ]; then
echo "eq 5"
elif [ $N -eq ]; then
echo "eq 8"
else
echo "no"
fi
如果第一个条件符合就不再向下匹配。
在写脚本时先在命令测试,无误后再写入脚本
if语句实例:编写一个计算器,实现简单的加减乘除
要求:
请输入一个数字: 7
请输入运算符:+
请输入第二个数字:7
7+7=14
[root@localhost ~]# vim count.sh
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入运算符:" cha
read -p "请输入第二个数字:" num2
count (){
echo "${num1}${cha}${num2}=$((${num1}${cha}${num2}))"
}
error () {
echo "Usage:$0 {+|-|*|/|0-9}"
}
if [ -n '$num1' -a -n '$hca' -a -n '$num2' ];then
if [ "$cha" == "+" ];then
count
elif [ "$cha" == "-" ];then
count
elif [ "$cha" == "*" ];then
count
elif [ "$cha" == "/" ];then
count
else
error
fi
else
echo '输入内容不能为空'
fi
:wq
[root@localhost ~]# bash count.sh
请输入第一个数字:
请输入运算符:+
请输入第二个数字:
+=
[root@localhost ~]# bash count.sh
请输入第一个数字:
请输入运算符:*
请输入第二个数字:
*=
[root@localhost ~]# bash count.sh
请输入第一个数字:l
请输入运算符:l
请输入第二个数字:l
Usage:count.sh {+|-|*|/|-}
3. for 语句
用于批量化部署
格式:for name [ [ in [ word ... ] ] ; ] do list ; done
for 变量名 in 取值列表; do
命令
done
或者
for 变量名 in 取值列表
do
命令
done
[root@localhost ~]# vim for_test.sh
#!/bin/bash
for i in {..}
do
echo $i
sleep #沉睡1秒,即1秒打印一个
done
:wq
[root@localhost ~]# bash for_test.sh
#实现100以内的偶数/奇数和 [root@localhost ~]#vim count_ou.sh
#!/bin/bash
sum=
for i in `seq ` #偶数和
do
let sum+=$i
done
echo $sum
:wq
[root@localhost ~]# bash count_ou.sh [root@localhost ~]# vim count_ji.sh
#!/bin/bash
sum=
for i in `seq ` #奇数和
do
let sum+=$i
done
echo $sum
:wq
[root@localhost ~]# bash count_ji.sh
#批量检查当前教室192.168.16.(1-10)网段主机是否在线
[root@localhost ~]# vim check_ip.sh
#!/bin/bash
. /etc/init.d/functions #引用文件
ip=192.168..
for i in {..}
do
if ping -c -w $ip$i &>/dev/null;then #返回执行结果0或1,其他文件导入黑洞文件
echo -n "$ip$i" #-n,不换行
success #相应function函数
echo "" #输出空格
else
echo -n "$ip$i"
failure
echo “ ”
fi
done
[root@localhost ~]# bash check_ip.sh
192.168.16.1 [ OK ]
192.168.16.2 [ OK ]
192.168.16.3 [FAILED]
192.168.16.4 [FAILED]
192.168.16.5 [FAILED]
192.168.16.6 [FAILED]
192.168.16.7 [FAILED]
192.168.16.8 [FAILED]
192.168.16.9 [FAILED]
192.168.16.10 [FAILED]
4. while语句用于监控
条件为真就进入死循环;条件为假就退出循环
格式:while list; do list; done
while 条件表达式; do
命令
done
[root@localhost ~]# vim while_.sh
#!/bin/bash
n=
while [ $n -lt ]
do
echo "$n"
let n++
done
:wq
[root@localhost ~]# bash while_.sh
当条件表达式为 false 时,终止循环。
条件表达式为 true,将会产生死循环。
死循环有什么作用那?
可以用来后台运行检测脚本,如下是是一个检测脑裂的脚本
我们只需要在命令行中输入 nohup bash naolie.sh & 即可在后台持续运行该脚本
#检测终端数量
[root@localhost ~]# vim check_zh.sh=
#!/bin/bash
while true
do
num=`who | wc -l`
echo"当前终端数量为$num"
sleep
done
:wq
[root@localhost ~]# bash check_zh.sh
当前终端数量为5
当前终端数量为5
当前终端数量为6
当前终端数量为6
^C #关掉该终端后停止检测
#将检测文件写入文件并放在后台执行
[root@localhost ~]# vim check_zh.sh
#!/bin/bash
while true
do
num=`who | wc -l`
echo "当前终端数量为$num" >> /root/check_zh
sleep
done
:wq
[root@localhost ~]# bash check_zh.sh & #&表示放在后台
[]
[root@localhost ~]# tail -f check_zh
当前终端数量为3
当前终端数量为3
…..
#关闭写入检测文件的该终端,监测终端停止
#若想关闭终端继续检测,将该监测文件挂起
[root@localhost ~]# nohup bash check_zh.sh &
[]
[root@localhost ~]# nohup: ignoring input and appending output to ‘nohup.out’[root@localhost ~]# ls
nohup.out #生成nohup.out文件
在监测则在该终端关闭后无影响
[root@localhost ~]# tail -f check_zh
当前终端数量为3
当前终端数量为3
当前终端数量为2
当前终端数量为2
…….
#若要关掉该监测2关掉运行的进程即可
[root@localhost ~]# ps aux | grep check_zh
root 0.0 0.1 ? S : : bash check_zh.sh
root 0.0 0.1 pts/ S : : bash check_zh.sh
root 0.0 0.0 pts/ R+ : : grep --color=auto check_zh
[root@localhost ~]# kill -
[root@localhost ~]# kill -
#逐行读取passwd文件
[root@localhost ~]# vim read.sh
#!/bin/bash
cat /etc/passwd | while read line
do
echo "$line"
sleep
done
:wq
[root@localhost ~]# bash read.sh
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
5. break和continue语句
break 是终止循环。
continue 是跳出当前循环。
[root@localhost ~]# vim test_break.sh
#!/bin/bash
sum=
while true
do
if [ $sum -eq ];then
break
fi
let sum++
echo "$sum"
done
:wq
[root@localhost ~]# bash test_break.sh
[root@localhost ~]# vim test_continue.sh
#!/bin/bash
sum=
while true
do
let sum++
if [ $sum -eq ];then
continue
fi
echo "$sum"
sleep
done
:wq
[root@localhost ~]# bash test_continue.sh #跳过了5,仅跳出来此次循环 ^C
6. case语句(sentos6常用)
case 语句一般用于选择性来执行对应部分块命令。
case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
*)
不符合以上模式执行的命令
esac
每个模式必须以右括号结束,命令结尾以双分号结束,最后一个模式不需要添加;;。
[root@localhost ~]# vim test_case.sh #!/bin/bash
case $ in
[-])
echo "数字"
;;
[a-z])
echo "a-z"
;;
[A-Z])
a=`tr $ a-z` #大写转化成小写
echo "$a"
;;
*)
echo "结束"
esac
:wq
[root@localhost ~]# bash test_case.sh
数字
[root@localhost ~]# bash test_case.sh a
a-z
[root@localhost ~]# bash test_case.sh A
a-z
#内存不足报警
#查看内存
[root@localhost ~]# free
total used free shared buff/cache available
Mem:
Swap:
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 976M 116M 599M 6.7M 260M 681M
Swap: 0B 0B 0B
[root@localhost ~]# free -h | grep M
Mem: 976M 116M 599M 6.7M 260M 681M
[root@localhost ~]# free -h | grep M | cut -d'M' -f4 [root@localhost ~]# free -h | grep M | cut -d'M' -f4 | tr -d ' ' [root@localhost ~]# vim mem_warning.sh
#!/bin/bash
while true
do
mem=`free -h | grep M | cut -d'M' -f4 | tr -d ' '`
if [ $mem -lt ];then
echo '当前内存不足,请及时处理'
break #警告一次即可
fi
done
:wq
7. 实训
1> 写一个脚本: 实现自动化一键部署NFS服务器端和客户端
#服务端:192.168.16.5;客户端:192.168.16.6
.5:
[root@localhost ~]# vim nfs_auto_client.sh
#!/bin/bash
mount /dev/cdrom /mnt &>/dev/null
yum install rpcbind nfs-utils -y &>/dev/null
mkdir /zxj &>/dev/null
mount -t nfs 192.168.16.6:/zxj /zxj
df -h
[root@localhost ~]# vim nfs_auto_server.sh
#!/bin/bash
#desc: This shell is for auto deploy nfs
#date: --
#author: zxj #服务端配置
pack_num=`ls /mnt | wc -l`
if [ $pack_num -eq ];then
mount /dev/cdrom /mnt &>/dev/null #检测是否挂载
fi
yum install rpcbind nfs-utils -y &>/dev/null
if [ $? -ne ];then
exit
fi
mkdir /zxj &>/dev/null
chown -R nsfnabody: /zxj
echo "/zxj 192.168.16.6(rw)" > /etc/exports
systemctl restart rpcbind nfs &>/dev/null #客户端配置
scp ./nfs_auto_client.sh 192.168.16.5:/root
ssh 192.168.16.6 bash /root/nfs_auto_client.sh
[root@localhost ~]# bash nfs_auto_server.sh
2> 第二个脚本:实现批量化检测当前教室主机在线状况,在线主机保存至一个文件中
[root@localhost ~]# vim check_online.sh
#!/bin/bash
touch online
echo "在线ip:" > online
ip=192.168..
for i in {..}
do
if ping -c -w $ip$i &>/dev/null;then
echo "$ip$i在线"
echo "$ip$i" >> online
else
echo "$ip$i不在线"
fi
done
cat online
:wq [root@localhost ~]# bash check_online.sh
192.168..5在线
192.168..6在线
192.168..7不在线
192.168..8不在线
192.168..9不在线
192.168..10不在线
192.168..11不在线
192.168..12不在线
192.168..13不在线
192.168..14不在线
192.168..15不在线
192.168..16在线
192.168..17不在线
192.168..18不在线
192.168..19不在线
192.168..20不在线
在线ip:
192.168.16.5
192.168.16.6
192.168.16.16 #或者
[root@localhost ~]# vim check_online.sh
#!/bin/bash
touch online
echo "在线ip:" > online
ip=192.168..
. /etc/init.d/functions
for i in {..}
do
if ping -c -w $ip$i &>/dev/null;then
echo -n "$ip$i"
success
echo ""
echo "$ip$i" >> online
else
echo -n "$ip$i"
failure
echo ""
fi
done
cat online
[root@localhost ~]# bash check_online.sh
192.168.16.5 [ OK ]
192.168.16.6 [ OK ]
192.168.16.7 [FAILED]
192.168.16.8 [FAILED]
192.168.16.9 [FAILED]
192.168.16.10 [FAILED]
192.168.16.11 [FAILED]
192.168.16.12 [FAILED]
192.168.16.13 [FAILED]
192.168.16.14 [FAILED]
192.168.16.15 [FAILED]
192.168.16.16 [ OK ]
192.168.16.17 [FAILED]
192.168.16.18 [FAILED]
192.168.16.19 [FAILED]
192.168.16.20 [FAILED]
在线ip:
192.168.16.5
192.168.16.6
192.168.16.16
3> 第三个脚本:实现批量化创建100个用户,并创建8位随机密码,且可登陆
#!/bin/bash
for i in {..}
do
useradd user$i
passwd=`echo $RANDOM | md5sum | cut -c -`
echo $passwd | passwd --stdin user$i
echo -e "账户:user$ \n密码:$passwd"
done
4> 第四个脚本:找出系统中含有某个关键词的文件,并输出到终端,关键词用户输入指定
[root@localhost ~]# vim find_key.sh
#!/bin/bash
read -p "Please input your keyword:" key
for file in `find / -type f``
do
if grep "$key" $file &>/dev/null;then
echo "$file"
fi
done
:wq
[root@localhost ~]# bash find_key.sh
Please input your keyword:anaconda
/boot/grub2/device.map
……
5> 第五个脚本:批量判断当前目录下所有文件类型
[root@localhost ~]# vim type.sh
#!/bin/bash
for file in `ls /root`
do
type=`ls -ld $file | cut -c `
if [ "$type" == "-" ];then
echo "$type------->$file=====普通文件"
elif [ "$type" == "d" ];then
echo "$type------->$file=====目录文件"
elif [ "$type" == "l" ];then
echo "$type------->$file=====链接文件"
else
echo "$type------->$file=====未知文件"
fi
done
:wq
[root@localhost ~]# bash type.sh
-------->anaconda-ks.cfg=====普通文件
-------->find_key.sh=====普通文件
-------->type.sh=====普通文件
6> 找到以.sh结尾的文件,计算文件大小总和,以KB为单位
#方法一: 用cut分割
[root@localhost ~]# vim sum_sh.sh
#!/bin/bash
sum=
for file in `find / -name "*.sh"`
do
size=`ls -l $file | cut -d " " -f `
let sum+=$size
done
echo "$(($sum/1024))KB"
[root@localhost ~]# bash sum_sh.sh
623KB # 方法二:用awk分割
[root@localhost ~]# vim sum_sh1.sh
#!/bin/bash
sum=
for file in `find / -name "*.sh"`
do
size=`ls -l $file | awk -F " +" '{printf $5}'`
let sum+=$size
done
echo "$(($sum/1024))KB"
:wq
[root@localhost ~]# bash sum_sh1.sh
623KB
Shell流程语句的更多相关文章
- shell流程语句使用介绍
1)使用if.case.read例子1:#!/bin/bash#读取终端输入的字符read -p "Please input a Number:" nn1=`echo $n|sed ...
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载
http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html nux shell有一套自己的流程控制语句,其中包括条件语句(if),循环 ...
- [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
原文链接:http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html linux shell有一套自己的流程控制语句,其中包括条件语句 ...
- [shell]流程控制----case语句
Shell case语句为多选择语句.可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: case 值 in 模式1) command1 command2 ...
- linux shell 流程控制
导读 和Java.PHP等语言不一样,linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介绍下,各个语句使 ...
- Shell 流程控制-if for case while until break continue
Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...
- 九、Shell 流程控制
Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...
- 吴裕雄--天生自然ShellX学习笔记:Shell 流程控制
和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...
- 第七课第一节,T语言流程语句( 版本5.0)
流程语句 if语句 用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.TC综合开发工具的if语句有三种基本形式,并且每个语句的结尾都要有一个end (注:关键字,if,e ...
随机推荐
- PTA 2-1 列出连通集【DFS+BFS基础】
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...
- 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)
一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...
- springcloud(二) 负载均衡器 ribbon
代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo ribbon是一个负载均衡客户端 类似nginx反向代理,可 ...
- JVM内存模型详解
内存模型 内存模型如下图所示 堆 堆是Java虚拟机所管理的内存最大一块.堆是所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域唯一的目的就是存放对象实例.所有的对象实例都在这里分配内存 Ja ...
- Swift @objcMembers
使用@objcMembers关键字,将类中的所有方法暴露给Objc (效果等同于为所有方法加上@objc). 示例代码: @objcMembers class MyController: UIView ...
- java webRoot 路径问题
项目部署后的目录结构 src 生成到 WEB-INF\classes文件下; WebRoot 为项目的根目录,应用中“/action”就相当于是系统目录中的”WebRoot/action" ...
- 宏 函数 内联函数inline
带参宏有时候可以代替函数作用:优点直接替代,省去函数调用过程的开销:但缺点也是很明显:容易出错,系统不做检查非常容易出错. 改进方案:内联函数:既有带参宏的直接替代(拷贝)的优点,又有系统检查的优点. ...
- Linux遗忘命令
1.查找文件的安装目录,拿nginx来说 find /|grep nginx.conf 2. a.查询某个端口是否被占用,如8080端口 netstat –apn | grep 8080 b.查看 ...
- node入门(三)——gulp运用实例
在上一篇<node入门(二)——gulpfile.js初探>中,我们知道了(看懂入门二及其参考资料)怎么运用gulp来更高效的开发,现在来示范一下. 在package.json里面配置好d ...
- MongoDB部署、使用、监控及调优
MongoDB部署 系统环境:CentOS7 下载地址:http://mirrors.163.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD ...