文档章节

shell编程-流程控制(一)

海军战士
 海军战士
发布于 2017/05/04 01:13
字数 1502
阅读 68
收藏 0

一、if语句

1 单分支if条件语句

以下例子判断分区的使用率

[root@wenhaijin shell]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G  5.9G   32G  16% /
tmpfs           939M  4.0K  939M   1% /dev/shm

[root@wenhaijin wenhaijin]# df -h | grep /dev/vda1 | awk '{print $5}' | cut -d "%" -f1
16

[root@wenhaijin shell]# vim if1.sh

#!/bin/bash
#获取根目录所在磁盘的使用率
rate=$(df -h | grep /dev/vda1 | awk '{print $5}' | cut -d "%" -f1 )
#当根目录磁盘使用率达到80%时,在屏幕上打印磁盘已满的信息
if [ $rate -ge 80 ]
        then echo "/dev/vda1 is full !!!"
fi
~
~
~
~
:wq!

[root@wenhaijin shell]# chmod 755 if1.sh 
[root@wenhaijin shell]# ./if1.sh
###没有达到80%无法测试效果,下面改成10%再执行

#!/bin/bash
#获取根目录所在磁盘的使用率
rate=$(df -h | grep /dev/vda1 | awk '{print $5}' | cut -d "%" -f1 )
#当根目录磁盘使用率达到10%时,在屏幕上打印磁盘已满的信息
if [ $rate -ge 10 ]
        then echo "/dev/vda1 is full !!!"
fi
~
~
~
~
:wq!

"if1.sh" 7L, 140C written                                     
[root@wenhaijin shell]# ./if1.sh 
/dev/vda1 is full !!!
[root@wenhaijin shell]# 

2.双分支if条件语句

2.1写一个判断apache服务是否正常,不正常就重启的shell

###判断apache是否启动
[root@wenhaijin ~]# ps aux | grep httpd
root     27745  0.0  0.0 103256   840 pts/7    S+   00:06   0:00 grep httpd
###安装apache
[root@wenhaijin ~]# yum -y install httpd
###启动apache
[root@wenhaijin ~]# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
###判断apache是否启动                                                           [  OK  ]
[root@wenhaijin ~]# ps aux | grep httpd
root     28293  0.0  0.1 175972  3728 ?        Ss   00:07   0:00 /usr/sbin/httpd
apache   28295  0.0  0.1 175972  2436 ?        S    00:07   0:00 /usr/sbin/httpd
apache   28296  0.0  0.1 175972  2436 ?        S    00:07   0:00 /usr/sbin/httpd
apache   28297  0.0  0.1 175972  2456 ?        S    00:07   0:00 /usr/sbin/httpd
apache   28298  0.0  0.1 175972  2436 ?        S    00:07   0:00 /usr/sbin/httpd
apache   28299  0.0  0.1 175972  2436 ?        S    00:07   0:00 /usr/sbin/httpd
apache   28300  0.0  0.1 175972  2436 ?        S    00:07   0:00 /usr/sbin/httpd
apache   28301  0.0  0.1 175972  2436 ?        S    00:07   0:00 /usr/sbin/httpd
apache   28302  0.0  0.1 175972  2436 ?        S    00:07   0:00 /usr/sbin/httpd
root     28362  0.0  0.0 103260   848 pts/7    S+   00:07   0:00 grep httpd
###也可以通过以下命令查看80端口(apache服务)是否启动
[root@wenhaijin ~]# netstat -tlun
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 0.0.0.0:137                 0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      
udp        0      0 0.0.0.0:137                 0.0.0.0:*                               
udp        0      0 0.0.0.0:44530               0.0.0.0:*                               
udp        0      0 0.0.0.0:631                 0.0.0.0:*                               
udp        0      0 172.18.69.197:123           0.0.0.0:*                               
udp        0      0 127.0.0.1:123               0.0.0.0:*                               
udp        0      0 0.0.0.0:123                 0.0.0.0:*   
###但是以上两种方式只能判断apache,是否启动,但是可能已经死机了,不提供访问
###可以通过nmap检查apache端口的服务访问状态
###若未安装nmap服务,可以通过yum源进行安装:yum install nmap
[root@wenhaijin ~]# nmap -sT 120.77.148.74

Starting Nmap 5.51 ( http://nmap.org ) at 2017-05-04 00:18 CST
Nmap scan report for 120.77.148.74
Host is up (0.0037s latency).
Not shown: 996 closed ports
PORT     STATE    SERVICE
22/tcp   open     ssh
25/tcp   filtered smtp
80/tcp   open     http
3306/tcp open     mysql

Nmap done: 1 IP address (1 host up) scanned in 1.27 seconds
[root@wenhaijin ~]# nmap -sT 120.77.148.74 | grep tcp | grep http
80/tcp   open     http
[root@wenhaijin ~]# nmap -sT 120.77.148.74 | grep tcp | grep http | awk '{print $2}'
open
[root@wenhaijin ~]# 


###以下通过shell判断httpd是否能够访问
#!/bin/bash

port=$( nmap -sT 120.77.148.74 | grep tcp | grep http | awk '{print $2}')

if [ "$port" == "open" ]
        then
                echo "$(date) httpd is ok !!">>/tmp/httpd_acc.log
        else
                /etc/rc.d/init.d/httpd restart &>/dev/null
                echo "$(date) httpd reboot!!">>/tmp/httpd_err.log
fi      
~
~
~
~
~
:wq!

[root@wenhaijin shell]# chmod 755 if2.sh 
[root@wenhaijin shell]# ./if2.sh 
###apache服务正常,打印日志
[root@wenhaijin shell]# cat /tmp/httpd_acc.log 
Thu May  4 00:35:15 CST 2017 httpd is ok if [ open == open ];         then
Thu May  4 00:36:34 CST 2017 httpd is ok !!
Thu May  4 00:39:59 CST 2017 httpd is ok !!
[root@wenhaijin shell]# 
###停止apache服务,然后执行shell,apache服务会自动重启
[root@wenhaijin shell]# service httpd stop
Stopping httpd:                                            [  OK  ]
[root@wenhaijin shell]# ./if2.sh 
[root@wenhaijin shell]# cat /tmp/httpd_err.log 
Thu May  4 00:42:30 CST 2017 httpd reboot!!
[root@wenhaijin shell]# 

2.2 写一个备份系统重要配置文件的脚本

#!/bin/bash
###同步系统时间
ntpdate asia.pool.ntp.org &>/dev/null 
###把当前时间按照"年月日"的格式赋予变量date
date=$(date +%y%m%d)
###统计etc目录大小并赋予size
size=$(du -sh /etc) 
         
if [ -d /tmp/etcback ]
        then  
                echo "Date is : $date" > /tmp/etcback/etc_back.txt
                echo "Size is : $size" >> /tmp/etcback/etc_back.txt
                tar -zcf /tmp/etcback/etc_$date.tar.gz /etc /tmp/etcback/etc_back.txt
                rm -rf /tmp/etcback/etc_back.txt &>/dev/null
        else
                mkdir /tmp/etcback
                echo "Date is : $date" > /tmp/etcback/etc_back.txt
                echo "Size is : $size" >> /tmp/etcback/etc_back.txt
                tar -zcf /tmp/etcback/etc_$date.tar.gz /etc /tmp/etcback/etc_back.txt
                rm -rf /tmp/etcback/etc_back.txt &>/dev/null
    
fi  
~   
~
~
:wq! 
"if3.sh" 20L, 622C written 

[root@wenhaijin shell]# chmod 755 if3.sh 
[root@wenhaijin shell]# ./if3.sh 
tar: Removing leading `/' from member names
[root@wenhaijin shell]# ls
[root@wenhaijin shell]# ls /tmp/etcback/
etc_170504.tar.gz


3.多分支if语句

以下例子根据用户输入的文件名判断用户输入的是何种文件

#!/bin/bash

#接收键盘的输入并赋予变量file
read -p "Please input a fileName: " file
#判断file变量是否为空
if[ -z "$file" ]
        then
                echo "Error,please input a filename"
                exit 1
#判断file的值是否存在
elif [ ! -e "$file" ]
        then
                echo "Your input is not a file!"
                exit 2
#判断file的值是否为普通文件
elif [ -f "$file" ]
        then
                echo "$file is a regulare file!"
#判断file的值是否为目录文件
elif [ -d "$file" ]
        then
                echo "$file is a directory!"
else
        echo "$file is an other file!"
fi



[root@wenhaijin shell]# chmod 755 if4.sh 
[root@wenhaijin shell]# ./if4.sh 
Please input a fileName: fefa
Your input is not a file!
[root@wenhaijin shell]# ./if4.sh 
Please input a fileName: if4.sh           
if4.sh is a regulare file!
[root@wenhaijin shell]# ./if4.sh 
Please input a fileName: /home
/home is a directory!
[root@wenhaijin shell]# 

二、case语句

以下是一个使用case语句来判断键盘输入的例子

#!/bin/bash

echo "If you want to install the soft?"
echo 'Please input "Y" to continue,or input "N" to cancel'
#接受键盘输入,并赋值给cho,输入等待30秒
read -t 30 -p "Please input your chooise:" cho

case "$cho" in
        "Y")
                echo "Software is being installed, please wait patiently!"
                ;;
        "N")
                echo "You have chosen to cancel the installation of this software!"
                ;;
        *)
                echo "Your input is incorrect!"
                ;;
esac
[root@wenhaijin shell]# chmod 755 case.sh 
[root@wenhaijin shell]# ./case.sh 
If you want to install the soft?
Please input "Y" to continue,or input "N" to cancel
Please input your chooise:N
You have chosen to cancel the installation of this software!
[root@wenhaijin shell]# ./case.sh 
If you want to install the soft?
Please input "Y" to continue,or input "N" to cancel
Please input your chooise:fe
Your input is incorrect!
[root@wenhaijin shell]# 

 

© 著作权归作者所有

海军战士
粉丝 21
博文 138
码字总数 132831
作品 0
深圳
私信 提问
python流程控制、函数总结

shell脚本是由系统命令、变量、流程控制三者组合而成的; 类比python程序,与shell中能够实现很多功能的系统命令类似,python有很多可以实现不同功能的模块; 变量方面,shell脚本有系统变量...

yumushui991
2017/03/09
0
0
shell编程入门

shell编程入门:linux命令行、重定向、管道;shell变量、shell条件判断、shell流程控制、shell函数 1.linux命令行、重定向、管道 http://my.oschina.net/shw23/blog/688280 2.shell基础 http...

shw23
2016/06/08
56
0
Shell学习之路和我发布过的Shell脚本博文

Shell学习之路 目录 Shell学习之路【第一篇】:别名,管道,用户配置文件,变量,read Shell学习之路【第二篇】:条件测试,运算符,选择结构,for循环结构 Shell学习之路【第三篇】:While循环,C-...

yht_1990
2016/07/19
0
0
shell脚本中的逻辑判断,文件目录属性判断,if特殊用法,case语句

笔记内容: 20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断 笔记日期:2017-11-22 20.5 shell脚本中的逻辑判断 在所有的编程语言中都会有if语句来进...

ZeroOne01
2017/11/22
0
0
shell编程之流程控制

1.if    "if" 表达式 如果条件为真则执行then后面的部分: if ....; then   .... elif ....; then   .... else   .... fi 大多数情况下,可以使用测试命令来对条件进行测试。比如可以比...

被使用的文件
2015/11/26
34
0

没有更多内容

加载失败,请刷新页面

加载更多

非递归实现后序遍历二叉树

问题描述 从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立)并对其进行后序遍历,然后将遍历结果打印输出。要求采用非递归方法实现。 解题思路 Push根结点到第一...

niithub
33分钟前
3
0
IDEA 自动删除类中无用的import包

1.手动快捷键 Ctrl + Alt + O 2.配置自动清理 Ctrl + Alt + S 打开设置 然后,进行如下操作:

时刻在奔跑
36分钟前
2
0
cwRsync提示password file must be owned by root when running as root的解决方法

cwRsync提示password file must be owned by root when running as root的解决方法 更新时间:2015年08月30日 23:05:52 投稿:mdxy-dxy 我要评论 今天在配置服务器的时候,用了rsync4.10版本...

rootliu
40分钟前
1
0
Java 交换两个参数

目前有一个小需求: 定义一个函数,交换两个值。于是,有人就写了这样一个函数。 public class exchange_01 { public static void main(String[] args) { // TODO Auto-gen...

hellation_
49分钟前
2
0
ExoPlayer简单使用

一、介绍 ExoPlayer是google开源的应用级媒体播放器项目,该开源项目包含ExoPlayer库和演示demo,github地址:https://github.com/google/ExoPlayer。 二、概述 ExoPlayer库的核心是ExoPlay...

零点B5
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部