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流程语句的更多相关文章

  1. shell流程语句使用介绍

    1)使用if.case.read例子1:#!/bin/bash#读取终端输入的字符read -p "Please input a Number:" nn1=`echo $n|sed ...

  2. linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载

    http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html nux shell有一套自己的流程控制语句,其中包括条件语句(if),循环 ...

  3. [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例

    原文链接:http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html linux shell有一套自己的流程控制语句,其中包括条件语句 ...

  4. [shell]流程控制----case语句

    Shell case语句为多选择语句.可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: case 值 in 模式1) command1 command2 ...

  5. linux shell 流程控制

    导读 和Java.PHP等语言不一样,linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介绍下,各个语句使 ...

  6. Shell 流程控制-if for case while until break continue

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  7. 九、Shell 流程控制

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  8. 吴裕雄--天生自然ShellX学习笔记:Shell 流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...

  9. 第七课第一节,T语言流程语句( 版本5.0)

    流程语句 if语句 用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.TC综合开发工具的if语句有三种基本形式,并且每个语句的结尾都要有一个end (注:关键字,if,e ...

随机推荐

  1. C#中自定义类数组和结构数组的使用

    如有雷同,不胜荣幸,若转载,请注明 C#中自定义类数组和结构数组的使用 最近在很多项目中发现很多时候给定的数组要实现某个逻辑或处理很是麻烦,一维数组,二维数组,,,等等需要经过n多转换,还不如自己写一 ...

  2. SQL - nulls值排序问题

    给字段排序时遇到的null值问题 当我们使用order by来为指定的字段进行排序时,如果db中该字段的值存在着null值,那么在排序时这些null值会不会参与排序呢?如果参与排序的话,又是以怎样的标 ...

  3. Python基础知识(2)

    1:if比较运算符.and.or >=:大于或者等于 <=:小于或者等于 ==:等于 !=:不等于  (<>:也是不等于,在Python2中可用.Python3中无法使用) a ...

  4. 多线程 线程间通信 wait,notify

    1. 方法wait锁释放,notify()锁不释放

  5. Vue项目搭建流程 以及 目录结构构建

    Vue项目搭建流程 以及 目录结构构建 一个小的Vue项目, 基于微信浏览器的移动端, 做了这么多的练习项目, 这一次准备记录下构建的过程, 以方便以后的调高效率 环境准备 操作系统 我的 windo ...

  6. 477 Total Hamming Distance 汉明距离总和

    两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量.计算一个数组中,任意两个数之间汉明距离的总和.示例:输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表 ...

  7. [在读]javascript框架设计

    司徒正美的书,内容我觉得不错,国内的书很少会讲这些.当然也有很多人吐槽它只贴代码没有解释,文笔不够优美啥啥的,我想说,不要在意这些细节,反正是值得买的一本.

  8. Setting up IPS/inline for Linux in Suricata

    不多说,直接上干货! 见官网 https://suricata.readthedocs.io/en/latest/setting-up-ipsinline-for-linux.html Docs » ...

  9. C#中的委托(转)

    C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...

  10. AJPFX辨析Java中运算符 ++ 和 += 的区别

    我们都知道Java中 ++ 和 +=1  都是把数字增加一后,把值赋给左边,那二者有什么区别呢? i+=1 运行的底层Heap申请一个区域存放i,在数据区域开劈一个区域存放1,2个内存段被数据被送入到 ...