本节内容

1. shell流程控制

2. for语句

3. while语句

4. break和continue语句

5. case语句

6. shell编程高级实战

shell流程控制

流程控制是改变程序运行顺序的指令。linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个语句使用方法

if语句

格式:

格式:if list; then list; [ elif list; then list; ] ... [ else list; ] fi

1.1 单分支

if 条件表达式; then
命令
fi

实例:

#!/bin/bash
N=
if [ $N -gt ]; then
  echo yes
fi # bash test.sh
yes

1.2 双分支

if 条件表达式; then
  命令
else
  命令
fi

实例1:

#!/bin/bash
N=
if [ $N -lt ]; then
  echo yes
else
  echo no
fi # bash test.sh
no

实例2:判断crond进程是否正在运行

-v: 表示取反

-c: 即count,取代通常的输出,显示行数

#!/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

实例3:检查主机是否在线

-c:表示发送几次包

-w:表示等待时间。当试图检测不可达主机时此选项很有用。

#!/bin/bash
if ping -c 192.168.1.1 &>/dev/null; then
  echo "OK."
else
  echo "NO!"
fi

if 语句可以直接对命令状态进行判断,就省去了获取$?这一步!

1.3 多分支

if 条件表达式; then
  命令
elif 条件表达式; then
  命令
else
  命令
fi

当不确定条件符合哪一个时,就可以把已知条件判断写出来,做相应的处理。

实例1:

$1:表示接受用户输入参数

#!/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

如果第一个条件符合就不再向下匹配。

shell编程之if语句实战案例

需求:

1. 完成用户输入文件或者目录的自动复制,并可以实现用户指定复制目标位置。

2. 用户体验佳。

#!/bin/bash
read -p "pls enter a file you want to copy:" file
if [ -f $file -o -d $file ];then
read -p "do you want to copy the $file?(y/n)" sure
     confirm=$(echo ${sure} | tr A-Z a-z)
if [ "$confirm" == "y" ];then
read -p "where do you want to copy?" dire
if [ -d $dire ];then
cp -a $file $dire
echo "the $file copied to $dire"
else
echo "the $dire is not exists"
exit
fi
elif [ "$confirm" == "n" ];then
echo "bye"
else
echo "pls input y or n"
fi
else
echo "the $file is not exists"
fi

练习题1:尝试写一个shell简单的计算器,实现加减乘除。

请输入一个数字: 7

请输入运算符:+

请输入第二个数字:7

7+7=14

练习题2:输入一个用户,用脚本判断判断该用户是否存在。

for语句

格式:for name [ [ in [ word ... ] ] ; ] do list ; done
for 变量名 in 取值列表; do
  命令
done 或者

for 变量名 in 取值列表

do

  命令

done

实例1:

#!/bin/bash
for i in {..}; do
  echo $i
done # bash test.sh

实例2:计算100以内偶数和

#!/bin/bash
sum=
for i in `seq `
do
let sum+=$i
done
echo "$sum"

shell编程之for语句实战案例

需求:

1. 批量检查当前教室主机是否在线

#!/bin/bash
. /etc/init.d/functions
ip=192.168..
for i in {..}
do
if ping -c -w $ip$i &>/dev/null;then
echo -n "$ip$i在线!"
success
echo ""
else
echo -n "$ip$i不在线!"
failure
echo ""
fi
done

练习题1:计算100以内的奇数和

练习题2:判断/root目录下面的文件类型

while语句

条件为真就进入死循环;条件为假就退出循环

格式:while list; do list; done
while 条件表达式; do
命令
done

实例1:

#!/bin/bash
N=
while [ $N -lt ]; do
  let N++
  echo $N
done # bash test.sh

当条件表达式为 false 时,终止循环。

实例2:条件表达式为 true,将会产生死循环

#!/bin/bash
while [ -eq ]; do
  echo "yes"
done

也可以条件表达式直接用 true:

#!/bin/bash
while true; do
  echo "yes"
done

死循环有什么作用那?

可以用来后台运行检测脚本,如下是是一个检测脑裂的脚本

我们只需要在命令行中输入 nohup bash naolie.sh & 即可在后台持续运行该脚本

例子1:检测脑裂

#!/bin/bash
while true
do
ip=`ip a s eth0 | awk -F " +" 'NR==4{print $3}' | awk -F "/" '{print $1}' | awk -F "." '{print $4}'`
ping -c -i -W 10.220.5.166 &>/dev/null
if [ $? -eq ] && [ $ip = ];then
echo "happed naolie"
else
echo "everything is ok"
fi
done

例子2:检测终端数量

#!/bin/bash
while true
do
num=`who | wc -l`
echo "当前打开终端数量为:$num"
sleep
done

要想使用 while 循环逐行读取 a.txt 文件,有三种方式:

方式 1:

#!/bin/bash
cat ./a.txt | while read LINE; do
  echo $LINE
done

方式2:

#!/bin/bash
while read LINE; do
  echo $LINE
done < ./a.txt

方式3:

exec < ./a.txt    # 读取文件作为标准输出
while read LINE; do
  echo $LINE
done

与 while 关联的还有一个 until 语句,它与 while 不同之处在于,是当条件表达式为 false 时才循环,实际使用中比较少,这里不再讲解。

#!/bin/bash
n=
until [ $n -eq ]
do
let n++
echo "$n" done

break和continue语句

break 是终止循环。

continue 是跳出当前循环。

示例 1:在死循环中,满足条件终止循环

#!/bin/bash
N=
while true; do
let N++
if [ $N -eq ]; then
break
fi
echo $N
done # bash test.sh

里面用了 if 判断,并用了 break 语句,它是跳出循环。与其关联的还有一个 continue 语句,它是跳出本次循环。

示例 2:举例子说明 continue 用法

#!/bin/bash
N=
while [ $N -lt ]; do
let N++
if [ $N -eq ]; then
continue
fi
echo $N
done # bash test.sh

当变量 N 等于 3 时,continue 跳过了本次循环,没有执行下面的 echo。

注意:continue 与 break 语句只能循环语句中使用。

[root@ken-node1 ~]# cat test.sh
#!/bin/bash
st=
while true
do
let st++
if [ $st -eq ];then
continue
elif [ $st -eq ];then
break
else
echo "$st"
fi done
[root@ken-node1 ~]# bash test.sh

case语句

case 语句一般用于选择性来执行对应部分块命令。

case 模式名    in
模式 )
  命令
  ;;
模式 )
  命令
  ;;
*)
  不符合以上模式执行的命令
esac

每个模式必须以右括号结束,命令结尾以双分号结束,最后一个模式不需要添加;;。

示例1:根据位置参数匹配不同的模式

#!/bin/bash
case $ in
start)
  echo "start."
  ;;
stop)
  echo "stop."
  ;;
restart)
  echo "restart."
  ;;
*)
  echo "Usage: $0 {start|stop|restart}"
esac # bash test.sh
Usage: test.sh {start|stop|restart} # bash test.sh start
start. # bash test.sh stop
stop. # bash test.sh restart
restart.

实例2:

#!/bin/bash
case $ in
[-])
  echo "match number."
  ;;
[a-z])
  echo "match letter."
  ;;
'-h'|'--help')
  echo "help"
  ;;
*)
  echo "Input error!"
  exit
esac # bash test.sh
match number. # bash test.sh a
match letter. # bash test.sh -h
help # bash test.sh --help
help

模式支持的正则有:*、?、[ ]、[.-.]、|。后面有章节单独讲解 Shell 正则表达式。

shell编程高级实战

实战1:写一个猜数字的小游戏

要求:

1. 猜对退出

2. 数字随机

3. 使用体验佳

#!/bin/bash
clear
num=`echo $RANDOM`
count=
while true
do
let count++
read -p "pls enter a num you guess:" guessnum
if [ $guessnum -lt $num ]; then
echo "the num is so smaller!"
elif [ $guessnum -gt $num ];then
echo "the num is so bigger!"
elif [ $guessnum -eq $num ];then
echo "right!wonderful! "
break
else
echo "good bye"
exit
fi
done
echo -e "\033[36myou guess $count times\033[0m" #-e允许对下面列出的加反斜线转义的字符进行解释.

实战2:检测当前教室在线IP地址

要求:

1.显示美观

#!/bin/bash
. /etc/init.d/functions
ip=172.20..
for i in {..}
do
if ping -c $ip$i &>/dev/null ;then
echo -n "$ip$i" #-n表示不输出行尾的换行符
success
echo ""
else
echo -n "$ip$i"
failure
echo ""
fi
done

实战3:检查软件包是否安装

要求:

1.用户输入软件名即可进行查询

#!/bin/bash
read -p "pls enter a softname:" softname
if rpm -q $softname &>/dev/null ;then
echo "the $softname is already installed"
else
echo "the $softname" is not installed
fi

实战4:打印九九乘法表

#!/bin/bash
for i in `seq `
do
for a in `seq `
do
if [ $a -le $i ];then
echo -n "$a*$i=$(($i*$a)) "
fi
done
echo ""
done

补充练习题

1.实现简单计算器(加减乘除)

#!/bin/bash
read -p "请输入第一个数字:" a
read -p "请输入运算符[+-*/]:" b
read -p "请输入第二个数字:" c
if [ -n "$a" -a -n "$b" -a -n "$c" ];then
if [ "$b" == "+" ];then
echo "$a+$c=$(($a+$c))"
elif [ "$b" == "-" ];then
echo "$a-$c=$(($a-$c))"
elif [ "$b" == "*" ];then
echo "$a*$c=$(($a*$c))"
elif [ "$b" == "/" ];then
echo "$a/$c=$(($a/$c))"
else
echo "请输入+—*%"
fi
else
echo "请按照要求输入内容!"
fi

2. 批量创建100个以数字开头的文件,并每隔一秒钟输出到终端

#!/bin/bash
for i in {..}
do
touch ${i}.txt
echo "${i}.txt"
sleep
done

3.动态持续监测本机linux系统内存剩余量(仅显示数值),并在终端输出

#!/bin/bash
while true
do
mem=`free -h | grep "Mem" | cut -d "M" -f | tr -d " "`
echo $mem
sleep done

课后练习题

写一个脚本: 实现自动化一键部署NFS服务器端和客户端

第二个脚本:实现批量化检测当前教室主机在线状况,在线主机保存至一个文件中

第三个脚本:实现批量化创建100个用户,并创建8位随机密码,且可登陆

第四个脚本:找出系统中含有某个关键词的文件,并输出到终端,关键词用户输入指定

第五个脚本:批量判断当前目录下所有文件类型

补充:shell练习题

1. 每一秒钟输出/root下的文件至屏幕

2. 打印出包含某个关键词的文件(关键词执行脚本时接收)

3. 统计系统中以.sh结尾的文件总大小,输出结果以kb为单位

参考答案:

1.

#!/bin/bash
for file in `ls /root`
do
echo $file
sleep 1
done

2.

#!/bin/bash
key=$1
for file in `find / -type f`
do
grep "$key" $file &>/dev/null
if [ $? -eq 0 ];then
echo $file
sleep 1
fi
done

3.

#!/bin/bash
sum=0
for size in `find /root -name "*.sh" -exec ls -l {} \; | cut -d " " -f 5`
do
let sum+=$size
done
echo "$((sum/1024))kb"

Shell编程(week4_day3)--技术流ken的更多相关文章

  1. Shell编程(week4_day1)--技术流ken

    本节内容 1.shell简介 2. shell分类 3. 查看shell 4. 第一个shell脚本 5. shell编程常用命令   5.1 grep   5.2 cut   5.3 sort   ...

  2. Shell编程(week4_day2)--技术流ken

    本节内容 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8. 变量类型 9. 特殊变量列表 1 ...

  3. Shell编程(week4_day5)--技术流ken

    本节内容 1. 三剑客简介 2. sed命令详解 3. awk命令详解 文本处理三剑客 在 Shell 下使用这些正则表达式处理文本最多的命令有下面几个工具: 命令                描述 ...

  4. Shell编程(week4_day4)--技术流ken

    本节内容 1. shell函数 2. shell正则表达式 shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直 ...

  5. zabbix实现百台服务器的自动化监控--技术流ken

    前言 最近有小伙伴通过Q联系到我说:公司现在有百多台服务器,想要部署zabbix进行监控,怎么实现自动化全网监控? 本篇博客将讲解一个我工作时做的一个实际项目,现在写出来供大家以后参考使用. 实现自动 ...

  6. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

  7. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken

    项目前言 在上一篇博客<Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken>中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个 ...

  8. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站(一)--技术流ken

    前言 在之前已经写了关于Git,Gitlab以及Ansible的两篇博客<Git+Gitlab+Ansible剧本实现一键部署Nginx--技术流ken>,<Git+Gitlab+A ...

  9. Jenkins凭证及任务演示-pipeline(二)--技术流ken

    Jenkins前言 在上一篇博客<Jenkins持续集成介绍及插件安装版本更新演示(一)--技术流ken>中已经详细介绍了jenkins的插件安装以版本更新等,本篇博客将再深入探究jenk ...

随机推荐

  1. tensor内部结构

    内部结构 1.tensor分为头信息区(Tensor)和存储区(Storage): 信息区:tensor的形状(size).步长(stride).数据类型(type),信息区占用内存较少 存储区:数据 ...

  2. mac上配置react-native环境run-ios/run-android命令遇到的问题

    新报错(rn版本:0.53.3)2018.3.6 今天在搞react-native环境时,遇到了一些坑,这里记录一下. 首先最重要的一点是一定要按官网一步一步来,不然可能会出现一些奇奇怪怪的问题! 官 ...

  3. jenkins安装配置

    一.下载Jenkins 官网地址:https://jenkins.io/,图如下所示,点击下载可下载最新版本. 点击下载之后,我们可以看到下面的图,我这边选择的Jenkins.war 文件. 下面,使 ...

  4. web测试点总结---UI、兼容、功能、交互、安全、性能、接口测试

    一.概述 1.什么是web? web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思.现广泛译作网络.互联网等技术领域.表现为三种形式,即超文本(hypertext).超媒体(hypermed ...

  5. 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别

    二.也是平时经常用到的offsetheight 它返回的高度是内容高+padding+边框,但是注意哦,木有加margin哦,当然一般也木有啥需要把margin加进去的,以上代码为例,结果显示上图h2 ...

  6. 在C++中,setw(int n)

    setw(int n)用来控制输出间隔例如:cout<<'s'<<setw(8)<<'a'<<endl;则在屏幕显示s        a //s与a之间 ...

  7. Python学习:类和实例

    Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...

  8. 【安富莱专题教程第1期】基于STM32的硬件RGB888接口实现emWin的快速刷新方案,32位色或24

    说明:1. 首先感谢ST终于推出了ARGB格式的emWin库,可谓千呼万唤始出来,使用STM32的硬件RGB888接口刷新图片慢的问题终于得到解决.2. 这个问题由来已久,是之前为我们的STM32-V ...

  9. IOS微信点击input弹出输入法,关闭后页面留白解决方案

    场景:IOS用微信点击input框弹出输入法后 不管你是输入信息,还是不输入直接点完成关闭输入法,都会导致页面被挤上去后产生留白,从而改变页面布局             解决方法: 给input添加 ...

  10. [Swift]LeetCode433. 最小基因变化 | Minimum Genetic Mutation

    A gene string can be represented by an 8-character long string, with choices from "A", &qu ...