1. if语句

(1) 单分支if条件语句

格式为:

# 注意条件判断式两端的空格if [ 条件判断式 ];then
    程序员
fi

或者

if[ 条件判断式 ]
    then
        程序
fi

例:判断分区使用率

#!/bin/bash

#获取根分区的使用率
rate=$()

 ]
    then
        echo "/dev/sda5 is over 10%!!"
fi

  (2) 双分支if条件语句

  格式为:

if [ 条件判断式 ]
    then
        条件成立时,执行的程序
    else
        条件不成立时,执行的另一个程序
fi

例1:备份/etc目录(同样适用于实际情况中的mysql备份)

#!/bin/bash
#备份mysql数据库
#Author :

#同步系统时间
#ntpdate asia.pool.ntp.org &> /dev/null
#把当前系统时间按照"年月日"格式赋予变量date
date=$(date +%y%m%d)
#统计mysql数据库的大小,并将其赋予size变量
size=$(du -sh /etc)

if [ -d /tmp/dbbak ]
    then
        echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
        echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt
        cd /tmp/dbbak
        tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null
        rm -rf /tmp/dbbak/dbinfo.txt
    else
        mkdir /tmp/dbbak
        echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
        echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt
        cd /tmp/dbbak
        tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null
        rm -rf /tmp/dbbak/dbinfo.txt
fi

例2:判断apache是否启动

#!/bin/bash
#Author : 

#使用nmap命令扫描服务器(-sT表示扫描指定服务器上开启的TCP端口),并截取apache服务的状态,赋予变量port
port=$(nmap -sT 192.168.1.155 | grep tcp | grep http | awk '{print $2}')

if [ "$port"=="open" ]
    then
        echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
    else
        /etc/rc.d/init.d/httpd start &> /dev/null
        echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi

(3) 多分支if条件语句

格式为:

if [ 条件判断式1 ]
    then
        当条件判断式1成立,执行程序1
elif [ 条件判断式2 ]
    then
        当条件判断式2成立时,执行程序2
...省略更多条件...
else
    当所有条件都不成立时,最后执行此程序
fi

例:判断用户输入的是什么文件

#!/bin/bash

#接收键盘收入,并赋予变量file
read -p "Please input a filename: " file

if [ -z file ]    #判断file变量是否为空
    then
        echo "Error,please input a filename"
        exit
elif [ ! -e "$file" ]    #判断file的值是否存在
    then
        echo "Your input is not a file!"
        exit
elif [ -f "$file" ]     #判断file的值是否为普通文件
    then
        echo "$file is a regulare file!"
elif [ -d "$file" ]
    then
        echo "$file is a directory!"
else
        echo "$file is an other file!"
fi

输出结果:

[root@localhost sh]# ./if4.sh
Please input a filename:
Your input is not a file!
[root@localhost sh]# echo $?

[root@localhost sh]# ./if4.sh
Please input a filename: /root
/root is a directory!

2. case语句

case语句和if...elif...fi语句一样都是多分支条件语句,不过case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case的格式为:

case $变量名 in
    "值1")
        如果变量的值等于值1,则执行程序1
        ;;
    "值2")
        如果变量的值等于值2,则执行程序2
        ;;
    ...省略其他分支...
    *)
        如果变量的值都不是以上的值,则执行此程序
        ;;
esac

例:判断用户输入

[root@localhost sh]# vi case1.sh

#!/bin/bash

read -p  cho

case $cho in
    "yes")
        echo "Your choose is yes!"
        ;;
    "no")
        echo "Your choose is no!"
        ;;
    *)
        echo "Your choose is error!"
        ;;
esac

输出结果:

[root@localhost sh]# chmod 755 case1.sh [root@localhost sh]# ./case1.sh
Please choose yes/no: yes
Your choose is yes!
[root@localhost sh]# ./case1.sh
Please choose yes/no: no
Your choose is no!
[root@localhost sh]# ./case1.sh
Please choose yes/no: ls
Your choose is error!

3. for循环

Linux中的for循环有多种语法格式:

格式1:
for 变量 in 值1 值2 值3
    do
        程序
    done 

例1:打印时间及输出结果

[root@localhost sh]# vi for1.sh
#!/bin/bash

for time in morning afternoon evening
    do
        echo "This time is $time"
    done

[root@localhost  for1.sh
[root@localhost sh]# ./for1.sh
This time is morning
This time is afternoon
This time is evening

例2:批量解压缩

[root@localhost sh]# vi for2.sh
#!/bin/bash

cd /tmp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
    do
        tar -zxf $i &> /dev/null
    done

rm -rf /tmp/ls.lo
格式2:
for (( 初始值;循环控制;变量变化 ))
    do
        程序
    done 

例1:从1加到100,并显示输出结果

[root@localhost sh]# vi for3.sh
#!/bin/bash

s=
;i<=;i=i+ ))
    do
        s=$(( $s + $i ))
    done

echo "The sum of 1+2+..+100 is : $s"

[root@localhost  for3.sh
[root@localhost sh]# ./for3.sh
The ++..+ is : 

注:两种for的区别在于是否事先知道处理的个数,如果知道,执行第二种for语法,否则执行第一种语法。

例2:批量添加指定数量的用户

[root@localhost sh]# vim for4.sh
#!/bin/bash
#Author:

read -t  -p "Please input username:" name
read -t  -p "Please input the number of users:" num
read -t  -p "Please input the passed of users:" pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
    then
        y=$(echo $num | sed 's/^[0-9]*$//g')
        if [ -z "$y" ]
            then
                ;i<=$num;i=i+ ))
                    do
                        /usr/sbin/useradd $name$i &> /dev/null
                        echo pass | /usr/bin/passwd --stdin $name$i &> /dev/null
                    done
        fi
fi

执行结果:

[root@localhost sh]# cat /etc/passwd
......
user1:x::::/home/user1:/bin/bash
user2:x::::/home/user2:/bin/bash

4. while循环与until循环

(1) while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样,其格式为:

while [ 条件表达式 ]
    do
        程序
    done

例1:从1加到100

[root@localhost sh]# vim while1.sh
#!/bin/bash
#Author:

s=
i=
 ]
    do
        s=$(( $s + $i ))
        i=$(( $i +  ))
    done

echo "The sum is : $s"

(2) until循环和while循环相反。until循环只要条件判断式不成立则进行循环,并执行循环程序。一旦条件判断式成立,则循环终止,其格式为:

until [ 条件判断式 ]
    do
        程序
    done

例:从1加到100

[root@localhost sh]# vim while1.sh
#!/bin/bash
#Author:

s=
i=
 ]
    do
        s=$(( $s + $i ))
        i=$(( $i +  ))
    done

echo "The sum is : $s"

Linux学习笔记(18) Shell编程之流程控制的更多相关文章

  1. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  2. #Linux学习笔记# 自定义shell终端提示符

    我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...

  3. linux学习笔记之shell

    本文参考:shell脚本学习指南 本文阅读前提为:知道shell指令,但不知道如何完成一个自动化的shell脚本. 因为编辑本文时,作者也是一个新手.所以,在一些理论上,可能存在错误.如果存在错误,希 ...

  4. Linux学习笔记18——信号1

    一 信号的基本概念 信号:是向进程发送的软件通知,通知进程有事件发生. 生成:表示一个信号的产生. 捕获:表示接收到一个信号. 信号的寿命:信号的生成和传递之间的时间间隔. 挂起的信号:已经生成但还未 ...

  5. JavaScript学习笔记(9)——JavaScript语法之流程控制

    javascript的流程控制语句与大部分类c语言一致.大致如下: 一.if if...else if...else if....else if....else..... 二.switch(变量){ ...

  6. linux —— 学习笔记(用户管理与权限控制)

    目录:1.用户的创建和管理    2.组的创建和管理 3.文件执行权限的控制 4.不用密码执行sudo 1.用户的创建和管理 用户的创建和管理: useradd.usermod . userdel . ...

  7. shell编程之流程控制

    -d 判断该文件是否存在,并且是否为目录文件 -e 判断该文件是否存在 -f 判断该文件是否存在,并且是否为普通文件 形式 [ -e   /home/cao/test.txt ] -r 文件 判断该文 ...

  8. 高性能javascript学习笔记系列(4) -算法和流程控制

    参考高性能javascript for in 循环  使用它可以遍历对象的属性名,但是每次的操作都会搜索实例或者原型的属性 导致使用for in 进行遍历会产生更多的开销 书中提到不要使用for in ...

  9. Java学习笔记(四):流程控制

    if语句 if判断语句比较简单,具体有下面的几种写法: int i = 0; // if 判断 if (i == 0) { // to do something } // if else 判断 if ...

随机推荐

  1. [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)

    继上一篇文章之后,本文将介绍 Controller 和 Action 的一些较高级特性,包括 Controller Factory.Action Invoker 和异步 Controller 等内容. ...

  2. git的两本推荐书

    1. pro git, 可以网页直接看 http://iissnan.com/progit/?spm=5176.100239.blogcont5843.18.nUJDcK 2. Git权威指南 < ...

  3. oracle中的连接查询与合并查询总结

    连接查询: 连接查询是指基于多张表或视图的查询.使用连接查询时,应指定有效的查询条件,不然可能会导致生成笛卡尔积.如现有部门表dept,员工表emp,以下查询因查询条件无效,而产生笛卡尔积:   (各 ...

  4. 智能车学习(十一)&mdash;&mdash;陀螺仪学习

    一.学习说明 感觉就是配置I2C通信,然后直接移植51代码... 二.代码分享: 1.头文件: #ifndef I2C_GYRO_H_ #define I2C_GYRO_H_ /*********** ...

  5. HDU 5795 A Simple Nim(简单Nim)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  6. 33Mybatis------Mapper的编写

    Mapper编写的三种方法 传统的做法: 接口实现类继承SqlSessionDaoSupport 使用此种方法需要编写mapper接口,mapper接口实现类.mapper.xml文件 1.  在sq ...

  7. 在Java中&gt;、&gt;&gt;、&gt;&gt;&gt;三者的区别

    Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力 ...

  8. 转:Windows Socket五种I/O模型

    原文转自:  Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...

  9. vmstat 命令详解 转载

    vmstat 命令详解   procs:r-->在运行队列中等待的进程数b-->在等待io的进程数w-->可以进入运行队列但被替换的进程 memoyswap-->现时可用的交换 ...

  10. (剑指Offer)面试题20:顺时针打印矩阵

    题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...