--------------------------------------------------------------------------------------------------------

【条件判断】

1. 按文件类型进行判断

  -b 文件    判断该文件是否存在,并且为块设备文件(是块设备文件为真)

  -c 文件    判断该文件是否存在,并且为字符设备文件(是字符设备文件为真)

  -d 文件    判断该文件是否存在,并且为目录文件(是目录为真)

  -e 文件    判断该文件是否存在(存在为真)

  -f 文件    判断该文件是否存在,并且为普通文件(是普通文件为真)

  -L 文件    判断该文件是否存在,并且为符号链接文件(是符号链接文件为真)

  -p 文件    判断该文件是否存在,并且为管道文件(是管道文件为真)

  -s 文件    判断该文件是否存在,并且为非空(非空为真)

  -S 文件    判断该文件是否存在,并且为套接字文件(是套接字文件为真)

两种判断格式:

① test -e /root/install.log

② [ -e /root/install.log ]

[ -f /root/install.log ] && echo 'yes' || echo 'no'

2. 按照文件权限进行判断(不区分所有者, 所属组)

  -r 文件    判断该文件是否存在,并且拥有读权限(有读权限为真)

  -w 文件    判断该文件是否存在,并且拥有写权限(有写权限为真)

  -x 文件    判断该文件是否存在,并且拥有执行权限(有执行权限为真)

  -u 文件    判断该文件是否存在,并且拥有SUID权限(有SUID权限为真)

  -g 文件    判断该文件是否存在,并且拥有SGID权限(有SGID权限为真)

  -k 文件    判断该文件是否存在,并且拥有SBit权限(有SBit权限为真)

3. 两个文件之间进行比较

  文件1 -nt 文件2    判断文件1的修改时间是否比文件2的新(如果新则为真)

  文件1 -ot 文件2    判断文件1的修改 时间是否比文件2的旧

  文件1 -ef 文件2    判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法。

4. 两个整数之间比较

  整数1 -eq 整数2    判断整数1是否和整数2相等(相等为真)

  整数1 -ne 整数2    判断整数1是否和整数2不相等(不相等为真)

  整数1 -gt 整数2    判断整数1是否大于整数2(大于为真)

  整数1 -lt 整数2    判断整数1是否大于整数2(小于为真)

  整数1 -ge 整数2    判断整数1是否大于等于整数2(大于等于为真)

  整数1 -le 整数2    判断整数1是否小于等于整数2(小于等于为真)

  [ 1 eq 2 ] && echo 'yes' || echo 'no'

5. 字符串的判断

  -z 字符串    判断字符串是否为空(为空返回真)

  -n 字符串    判断字符串是否为非空(非空返回真)

  字符串1 == 字符串2    判断字符串1和字符串2是否相等(相等返回真)

  字符串1 != 字符串2    判断字符串1是否和字符串2不相等(不相等返回真)

  

  name=chen

  [ -z "$name" ] && echo 'yes' || echo 'no'

6. 多重条件判断

  判断1 -a 判断2    逻辑与,判断1和判断2都成立,最终的结果才为真

  判断1 -o 判断2    逻辑或,判断1和判断2有一个成立,最终的结果就为真

  ! 判断    逻辑非,使原始的判断式取反

  

  a=24

  [ -n "$a" -a "$a" -gt 23 ] && echo 'yes' || echo 'no'

【流程控制 - if 语句】

1. 单分支if条件语句

if [ 条件判断式 ]; then
程序
fi
if test -z "$ac_version"; then​
程序
fi

或者

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

注意:

① if开头,fi结尾

② [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

③ then后面跟符合条件之后执行的程序,可以放在[]之后,用" ; "分割,也可以换行写入,就不需要" ; "了。

#!/bin/bash
# 统计根分区使用率 rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f1) # 把根分区使用率作为变量值赋予变量rate if [ $rate -ge ]; then
echo "Warning! /dev/sda3 is full !"
fi

2. 双分支if条件语句

if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
#!/bin/bash
# 备份mysql数据库 ntpdate asia.pool.ntp.org &> /dev/null # 同步系统时间(需联网) date=$(date +%y%m%d) # 把当前系统时间按照"年月日"格式赋予变量date size=$(du -sh /var/lib/mysql) # 统计mysql数据库的大小,并把大小赋予size变量 if [ -d /tmp/dbbak ]
then
echo "Date: $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size: $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt
&> /dev/null # 把所有输出丢弃
rm -rf /tmp/dbbak/dbinfo.txt  # 卸磨杀驴
else
mkdir /tmp/dbbak
...
fi
#!/bin/bash
# 判断Apache是否启动 ( 先安装nmap:rpm -ivh http://nmap.org/dist/nmap-4.68-1.i386.rpm ) port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}') # 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port

if [ "$port" == "open" ]
then
echo "$(date) httpd is ok!" >> /tmp/httpd-acc.log  # 如果状态正常,追加到日志中
else
/etc/rc.d/init.d/httpd start &> /dev/null  # 把所有输出丢弃
echo "$(date) httpd reboot!" >> /tmp/httpd-err.log  # 重启记录追加到错误日志
fi

3. 多分支if条件语句

if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...更多判断...
else
当所有条件都不成立时,最后执行此程序
fi
#!/bin/bash
# 判断用户输入的是什么文件 read -p "Please input a filename:" file # 接收键盘的输入,并赋予变量file if [ -z "$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 regular fie!"
elif [ -d "$file" ]
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi

【流程控制 - case 语句】

多分支case条件语句:case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#!/bin/bash
# 判断用户输入
read -p "Please choose yes/no" -t cho case $cho in
"yes")
echo "You choose yes"
;;
"no")
echo "You choose no"
;;
*)
echo "You choose none"
;;
esac

【流程控制 - for 循环】

语法1:

for 变量 in 值1 值2 值3... ; do
程序
done

语法2:

for (( 初始值; 循环控制条件; 变量变化 ))
do
程序
done
#!/bin/bash
# 打印时间
for time in morning noon afternoon evening ; do
echo "This time is $time"
done for i in ; do
echo $i
done
#!/bin/bash
# 批量解压缩脚本 cd /lnmp
ls *.tar.gz > ls.log for i in $(cat ls.log) ; do
tar -zxf $i &> /dev/null
done
rm -rf /lnmp/ls.log
#!/bin/bash
# 求和 s=
for (( i=; i<=; i++ )) ; do
s=$(( $s + $i ))
done
echo "The sum of 1+2+3+...+100 is : $s"
#!/bin/bash
# 批量添加指定数量的用户 read -p "Please input user name:" -t name
read -p "Please input the number of users:" -t num
read -p "Please input the password of users:" -t pass # -a用于连续多个条件判断
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/^[0-9]*$//g') # 任意数字替换为空
if [ -z "$y" ] # 如果y的值是空,则num是数字
then
for (( i=; i<=$num; i++ ))
do
/usr/sbin/useradd $name$i &> /dev/null
echo $pass | /usr/bin/passwd --stdin "$name$i" &> /dev/null
done
fi
fi

【流程控制 - while 和 until 循环】

while循环是条件循环,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

while [ 条件判断式 ]
do
程序
done
#!/bin/bash
# 示例用法 while [ $# -gt ]; do
case "$#" in
)
echo "第一个参数是$1, 参数个数是$#"
;;
)
echo "第一个参数是$1, 参数个数是$#"
;;
*)
echo 'What happened'
;;
esac # 与case对应构成case语句,形如if和fi case "$#" in
abc)
... ;;
esac
shift # 用shift命令把位置参数左移
done

运行如:./example.sh 3 4 5

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

#!/bin/bash

i=
s=
until [ "$i" -gt ] # 循环直到变量i的值大于100就停止循环
do
s=$(( $i + $s))
i=$(( $i + ))
done
echo "The sum is : $i"

【总结】

Shell适用:帮助管理员减少重复操作、运维操作,流程控制与 linux 强大命令的结合,但不适合进行复杂的运算的场合。

如何建立编程思想:学习,练习,知道让程序帮你干什么。

Link:http://www.cnblogs.com/farwish/p/4855284.html

[Shell]条件判断与流程控制:if, case, for, while, until的更多相关文章

  1. shell条件判断与流程控制

    一 条件判断式语句 1.按文件类型进行判断 测试类型 作用 -b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备 ...

  2. Shell脚本 (三) 条件判断 与 流程控制

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 六.条件判断 1.基本语法 [ condition ](注意condition 前后要有空格) 注意:条 ...

  3. shell编程-条件判断与流程控制

    1.条件判断式 按照文件类型进行判断: 两种判断格式: test -e /root/install.log [ -e /root/install.log ] 判断命令是否正确执行: [ -d /roo ...

  4. shell条件测试和流程控制

    一.条件测试操作 1.test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值 格式:test 表达式 2.常见的测试类型 ①测试文件状态 格式:[ 操作符 文件 ...

  5. Shell条件测试和流程控制-4

  6. 【重点】Shell入门教程:流程控制(3)条件判断式的真假值

    之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断.传回0,即为真:传回非0,即为假. 在Bash中,这种可以影响程序流程的式子,称为条件判断式.判断式的操作数分成“单元”及 ...

  7. 【重点】Shell入门教程:流程控制(2)条件判断的写法

    第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...

  8. 《Shell脚本学习指南》学习笔记之变量、判断和流程控制

    变量 定义变量 可以使用export和readonly来设置变量,export用于修改或打印环境变量,readonly则使得变量不得修改.语法: export name[=word] ... read ...

  9. shell(shell变量、条件表达式、流程控制)

    本章内容: 变量 运算 if语句 for语句 while语句 break.continue 实例 shell变量 1.shell变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数 ...

随机推荐

  1. 物流公司统计按物资类别采购的前二十家sql

    2.集团主要的供应商(按物资分类列举前10或20家名单),年采购金额.占比,结算方式,付款周期:(夏) 年份要求是2013年 arap_djfb中的单据日期不是常规的日期类型 需要做这样的转换才可以 ...

  2. python中获取当前所有的logger

    获得当前所有logger的列表的程序如下: import logging for name in logging.Logger.manager.loggerDict.keys(): logger = ...

  3. Datagridview 添加checkbox列,并判断Datagridview 中的checkbox列是否被选中

    Solution1://In Fill DataGridViewEvent : DataGridViewCheckBoxColumn ChCol = new DataGridViewCheckBoxC ...

  4. mysql死锁问题分析

    线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”. Oh, My God! 是死锁问题.尽管报错不多,对性能目前看来 ...

  5. Redirecting Console.WriteLine() to Textbox

    I'm building this application in Visual Studio 2010 using C#. Basically there are 2 files, form1.cs ...

  6. 不同hadoop集群之间迁移hive数据

    #!/bin/bash #set -x DB=$1 #获取hive表定义 ret=$(hive -e 'use ${DB};show tables;'|grep -v _es|grep -v _hb| ...

  7. (整理)SQLServer 大数据的插入与查询

    最近几天一直在折腾大数据量的查询,最后在索引.分页存储过程和控件以及视图的帮助下,搞定了.这篇文章记录解决问题时候查看的网友的分享链接,以及大数据量数据的插入链接. DatagridView Virt ...

  8. .NET使用一般处理程序生成验证码

    运行的效果图: HTML的代码: <head> <script type="text/javascript"> function changeCode() ...

  9. IQ推理:P先生和Q先生

    P先生.Q先生具有足够的推理能力.这天,他们正在接受面试. 他们知道桌子的抽屉里有16张扑克牌:红桃 A Q 4黑桃 J 8 4 2 7 3草花 K Q 5 4 6方块 A 5约瀚教授从这16张牌中挑 ...

  10. JAVA 多线程和并发学习笔记(一)

    一.进程与线程 1. 进程 当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中的程序.进程是操作系统进行资源分配和调度的一个独立单位.进程的三个特征: 独立性 独立存在的实体,每个进程都有 ...