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 ...
随机推荐
- 基础BFS+DFS poj3083
//满基础的一道题 //最短路径肯定是BFS. //然后靠右,靠左,就DFS啦 //根据前一个状态推出下一个状态,举靠左的例子,如果一开始是上的话,那么他的接下来依次就是 左,上 , 右 , 下 // ...
- bzoj 1003: [ZJOI2006]物流运输【spfa+dp】
预处理出ans[i][j]为i到j时间的最短路,设f[i]为到i时间的最小代价,转移显然就是 f[i]=min(f[j-1]+ans[j][i]*(i-j+1)+k); #include<ios ...
- zabbix自定义item(v3.4)
1 添加user key agent.conf UnsafeUserParameters=1 UserParameter=mysql_if_running,sh /app/zabbix/alertsc ...
- April Fools Contest 2017 E
Description Input The input consists of four lines, each line containing a single digit 0 or 1. Outp ...
- JAVA常用知识总结(二)
JAVA中的参数传递总结先看两道笔试题: public class Test2 { public static void main (String [] args) { StringBuffer a ...
- K-th Number 线段树的区间第K大
http://poj.org/problem?id=2104 由于这题的时间限制不紧,所以用线段树水一水. 每个节点保存的是一个数组. 就是对应区间排好序的数组. 建树的时间复杂度需要nlogn 然后 ...
- Linux上不了网——wget无法解析主机
很有可能是网关和域名服务器没有设置 1.设置网关 netstat -rn #查看网关配置情况 [hadoop@slave1 ~]$ route -n Kernel IP routing table D ...
- php服务端接收post的json数据
最近用到ext与PHP交互,ext把json数据post给PHP,但在PHP里面$_post获取不到,$_REQUEST也获取不到,但是通过firedebug看到的请求信息确实是把JSON数据post ...
- 【转】java序列化一定要应该注意的6个事项!
1.如果子类实现Serializable接口而父类未实现时,父类不会被序列化,但此时父类必须有个无参构造方法,否则会抛InvalidClassException异常. 2.静态变量不会被序列化,那是类 ...
- logging模块基础
很多程序都有记录日志的需求,日志不仅可以保存访问记录,也可以有错误,警告等信息输出. python的logging模块提供了标准的日志接口,可以通过logging存储各种格式的日志.logging模块 ...