1. if语句

(1) 单分支if条件语句

格式为:

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

例:判断分区使用率

#!/bin/bash

#获取根分区的使用率
rate=$(df -h | grep "/dev/sda5" | awk '{print $5}' | cut -d "%" -f ) if [ $rate -ge ]
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 "Please choose yes/no: " -t  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 sh]# chmod 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=
for(( i=;i<=;i=i+ ))
do
s=$(( $s + $i ))
done echo "The sum of 1+2+..+100 is : $s" [root@localhost sh]# chmod for3.sh
[root@localhost sh]# ./for3.sh
The sum of ++..+ 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
for(( i=;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=
while [ $i -le ]
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=
until [ $i -gt ]
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脚本学习

    概念 真正能够控制计算机硬件(CPU.内存.显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁. 由于安全.复杂.繁琐等原因,用户不能直接接触内核(也没有 ...

  3. Linux学习笔记 -- 初识 Shell

    Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...

  4. linux学习(七)Shell编程中的变量

    目录 shell编程的建立 shell的hello world! Shell的环境变量 使用和设置环境变量 Shell的系统变量 用户自定义变量 @(Shell编程) shell编程的建立 [root ...

  5. golang学习笔记(二):流程控制

    欢迎访问我的博客和github! 今天咱们把烦人的事情丢一丢,继续来学习go的基础知识. 这篇文章记录go语言的流程控制和更多类型. 流程控制 for Go 只有一种循环结构:for 循环. 基本的 ...

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

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

  7. linux学习笔记之shell

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

  8. Linux学习笔记<五>——<Shell部分>

    管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...

  9. Linux学习笔记 -- 为 Shell 传递参数

    我们可以在执行 Shell 脚本时,可以向脚本传递参数.脚本内获取参数的格式为:$n.(n 代表一个数字,0为所执行的shell脚本名称,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类 ...

随机推荐

  1. c++ 文件utf-8格式

    #include <stdio.h> int i = 0; while (i < 20) {    i++;    WriteLog("d:\\log.txt", ...

  2. HttpWebRequest.GetResponse 方法

    GetResponse 方法返回包含来自 Internet 资源的响应的 WebResponse 对象. 实际返回的实例是 HttpWebResponse,并且能够转换为访问 HTTP 特定的属性的类 ...

  3. python中的编码问题:以ascii和unicode为主线

      1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8 ...

  4. C Primer Plus_第二章_C语言概述_复习题与编程练习

    REVIEW 1.如何称呼C程序的基本模块? ans 它们被称为函数 2.什么是语法错误?给出一个英语例子和一个C语言例子 me C的语法错误是指把正确的C符号放在了错误的位置 likes codin ...

  5. Gson解析复杂的json数据

    最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的json解析方法即JsonObject ...

  6. 【python】time,datetime,string相互转换

    来源:http://essen.iteye.com/blog/1452098 #把datetime转成字符串 def datetime_toString(dt): return dt.strftime ...

  7. 【python】sql语句插入中内容同时包含单引号和双引号的解决办法

    在python中调用MySQLdb模块插入数据信息,假设待输入信息data为: Hello'World"! 其中同时包含了单引号和双引号 一般插入语句为 sql = "insert ...

  8. win7下安装openpyxl

    想使用python来操作Excel,看资料据说openpyxl非常好用,于是到https://pypi.python.org/pypi/openpyxl下载了安装包.下面就来说说安装步骤,也算是对自己 ...

  9. .net如何实现时间相减得到天数

    第一种方法: 为了得到时间的天数,代码如下:(计算整天,不含半天) DateTime start = DateTime.Parse(txt_start.Value.Trim());//开始时间 Dat ...

  10. Hibernate查询语句

    1 hql查询 Hibernate的查询语句,hiberante提供的面向对象的查询语言,和sql语句的语法的相似.而且严格区分大小写. 1.1 from字句 /** * hql: from 字句 * ...