shell条件判断与流程控制

时间:2022-12-23 11:03:36
  • 一  条件判断式语句

1.按文件类型进行判断

测试类型 作用
-b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备文件为真)
-d 文件 判断文件是否存在,并且是否为目录文件(是目录文件为真)
-e 文件 判断文件是否存在,(存在为真)
-f 文件 判断文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件 判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件 判断文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件 判断文件是否存在,并且是否为非空(非空为真)
-S 文件 判断文件是否存在,并且是否为套接字文件(是套接字文件为真)

两种判断格式

  • test -e /root/install.log
  • [ -e /root/install.log ]  
 [root@MacBook-Pro ~]# test -e /etc/passwd
[root@MacBook-Pro ~]# [ -e /etc/passwd ]
[root@MacBook-Pro ~]# echo $? [root@MacBook-Pro ~]# test -e /etc/passwd
[root@MacBook-Pro ~]# echo $? [root@MacBook-Pro ~]# [ -e /etc/passwdhsdfkjashdf ]
[root@MacBook-Pro ~]# echo $? [root@MacBook-Pro ~]# [ -d /root ] && echo "yes" || echo "no"
yes
[root@MacBook-Pro ~]#

2.按照文件权限进行判断

测试选项 作用
-r 文件 判断该文件是否存在,并且该文件是否拥有读权限 (有读权限为真)
-w 文件 判断该文件是否存在,并且该文件是否拥有写权限 (有写权限为真)
-x 文件 判断该文件是否存在,并且该文件是否拥有执行权限 (有执行权限为真)
-u 文件 判断该文件是否存在,并且该文件是否拥有SUID权限 (有SUID权限为真)
-g 文件 判断该文件是否存在,并且该文件是否拥有SGID权限 (有SGID权限为真)
-k 文件 判断该文件是否存在,并且该文件是否拥有SBit权限 (有SBit权限为真)
 [ucm@MacBook-Pro testpace]$ ll
总用量
-rw-r--r--. ucm ucm 12月 : stu.log
[ucm@MacBook-Pro testpace]$ [-w stu.log] && echo yes || echo no
bash: [-w: 未找到命令...
no
#注意 :[] 括号中的判断式必须有空格
[ucm@MacBook-Pro testpace]$ [ -w stu.log ] && echo yes || echo no
yes
[ucm@MacBook-Pro testpace]$
#该例子中该文件的权限只要有写权限,就判断为真,不管是其拥有者权限,还是所属组的权限。---------即:不能判断指定的权限。

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

测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2新 (如果新,则为真)
文件1 -ot 文件2 判断文件1的修改时间是否比文件2旧 (如果旧,则为真)
文件1 -ef 文件2 判断文件1与文件2的Inode号是否一致;可以理解为两个文件是否为同一个文件。用于判断是否是硬连接
 [ucm@MacBook-Pro testpace]$ ll
总用量
-rw-r--r--. ucm ucm 12月 : stu.log
[ucm@MacBook-Pro testpace]$ pwd
/home/ucm/testpace
[ucm@MacBook-Pro testpace]$ ln /home/ucm/testpace/stu.log /tmp/pace/stu.txt
ln: 无法创建硬链接"/tmp/pace/stu.txt" => "/home/ucm/testpace/stu.log": 没有那个文件或目录
[ucm@MacBook-Pro testpace]$ ln /home/ucm/testpace/stu.log /tmp/stu.txt
[ucm@MacBook-Pro testpace]$ ll
总用量
-rw-r--r--. ucm ucm 12月 : stu.log
[ucm@MacBook-Pro testpace]$ cd /tmp/
[ucm@MacBook-Pro tmp]$ ll
总用量 ***
-rw-r--r--. ucm ucm 12月 : stu.txt
[ucm@MacBook-Pro tmp]$ [ /home/ucm/testpace/stu.log -ef /tmp/stu.txt ] && echo yes || echo no
yes
[ucm@MacBook-Pro tmp]$

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 (小于等于为真)
 JideMacBook-Pro:testpace jixiaodong$ [  -ge  ] && echo yes || echo no
yes
JideMacBook-Pro:testpace jixiaodong$ [ -le ] && echo yes || echo no
no
JideMacBook-Pro:testpace jixiaodong$

5.字符串的判断

测试选项 作用
-z 字符串 判断字符串是否为空 (为空返回真)
-n 字符串 判断字符串是否非空 (非空返回真)
字符串1 == 字符串2 判断字符串1是否与字符串2相等 (相等返回真)
字符串 != 字符串2 判断字符串1是否与字符串2不相等 (不相等返回真)
 [ucm@MacBook-Pro ~]$ name=echohello
[ucm@MacBook-Pro ~]$ [ -z "$name" ] && echo yes || echo no
no
[ucm@MacBook-Pro ~]$ [ -n "$name" ] && echo yes || echo no
yes
[ucm@MacBook-Pro ~]$
 [ucm@MacBook-Pro ~]$ aa=
[ucm@MacBook-Pro ~]$ bb=22
此处是判断的字符串相等,如果需要判断数值相等,则需要使用 -ep
[ucm@MacBook-Pro ~]$ [ $aa==$bb ] && echo yes || echo no
yes
[ucm@MacBook-Pro ~]$ echo $AA [ucm@MacBook-Pro ~]$ echo $aa [ucm@MacBook-Pro ~]$ echo $bb [ucm@MacBook-Pro ~]$ [ "$aa"=="$bb" ] && echo yes || echo no
yes
==号左右需要有空格!!!
[ucm@MacBook-Pro ~]$ [ "$aa" == "$bb" ] && echo yes || echo no
no
[ucm@MacBook-Pro ~]$

6.多重条件判断

测试选项 作用
判断式1 -a 判断式2 逻辑与
判断式1 -o 判断式2 逻辑或
! 判断 逻辑非
 [ucm@MacBook-Pro ~]$ echo $aa

 [ucm@MacBook-Pro ~]$ echo $bb

 [ucm@MacBook-Pro ~]$ [ -n "$aa" -a "$aa" -gt "$bb" ] && echo yes || echo no
no
[ucm@MacBook-Pro ~]$

二  单分支if语句

if [ 条件判断式 ] ;then

  程序

fi

或者:

if [ 条件判断式 ]

  then

  程序

fi

 [ucm@MacBook-Pro testpace]$ cat user.sh
#!/bin/bash test=$(env | grep "USER" | cut -d "=" -f ) if [ "$test" == ucm ]
then
echo "now user is $test"
fi
[ucm@MacBook-Pro testpace]$ ./user.sh
now user is ucm
[ucm@MacBook-Pro testpace]$
 [ucm@MacBook-Pro testpace]$ cat df.sh
#!/bin/bash source=$(df -h | grep "/cl-root" | awk '{print $5}' | cut -f -d "%") if [ $source -gt ]
then
echo "this is full"
fi
[ucm@MacBook-Pro testpace]$ ./df.sh
this is full
[ucm@MacBook-Pro testpace]$

三  双分支条件语句

if [ 条件判断式 ]

  then

    条件成立时,执行

  else

    条件不成立时,执行

fi

 [ucm@MacBook-Pro testpace]$ ll
总用量
-rw-rw-r--. ucm ucm 1月 : =
-rwxr-xr-x. ucm ucm 1月 : df.sh
-rwxr-xr-x. ucm ucm 1月 : dir.sh
-rwxr-xr-x. ucm ucm 1月 : echo.sh
-rw-r--r--. ucm ucm 12月 : stu.log
-rwxr-xr-x. ucm ucm 1月 : user.sh
[ucm@MacBook-Pro testpace]$ pwd
/home/ucm/testpace
[ucm@MacBook-Pro testpace]$ ./dir.sh
please input a dir: /home/ucm
this is dir
[ucm@MacBook-Pro testpace]$ ./dir.sh
please input a dir: /home/ucm/testpace/stu.log
this is not dir
[ucm@MacBook-Pro testpace]$ cat dir.sh
#!/bin/bash read -t -p "please input a dir: " dir if [ -d "$dir" ]
then
echo "this is dir" else
echo "this is not dir"
fi
[ucm@MacBook-Pro testpace]$
 [ucm@MacBook-Pro testpace]$ cat apache.sh
#!/bin/bash apache=$(ps -aux | grep httpd | grep -v "grep") if [ -n "$apache" ]
then
echo "$(date) httpd is ok !" >> /tmp/apache.log
else
service httpd start
# 此处写成service httpd start,并不稳妥,我的linux的/etc/rc.d/init.d/中没有找到httpd文件。
echo "$(date) restart httpd !" >> /tmp/apache.log
fi
[ucm@MacBook-Pro testpace]$

四  多分支if语句

if [ 条件判断式1 ]

  then

    条件判断式1成立时,执行程序1

elif [ 条件判断式2 ]

  then

    条件判断式2成立时,执行程序2

····

else

  当所有条件判断式都不成立时,执行此程序

fi

举个例子:计算器

 [ucm@MacBook-Pro testpace]$ cat calc.sh
#!/bin/bash read -t -p "请输入第一个数字:" num1
read -t -p "请输入第二个数字:" num2
#通过read命令接收用户输入,并存储到变量num1/num2中
read -t -p "请输入运算类型【+-*/】:" ope
#通过read命令接收计算的类型 if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
then
test1=$(echo $num1 | sed 's/[0-9]//g')
test2=$(echo $num2 | sed 's/[0-9]//g')
if [ -z "$test1" -a -z "$test2" ]
then
if [ "$ope" == "+" ]
then
result=$(( $num1 + $num2 ))
elif [ "$ope" == '-' ]
then
result=$(( $num1 - $num2 ))
elif [ "$ope" == '*' ]
then
result=$(( $num1 * $num2 ))
elif [ "$ope" == '/' ]
then
if [ "$num2" != '' ]
then
result=$(( $num1 / $num2 ))
else
echo "分母不可为0"
exit
fi
else
echo "请输入正确的运算符"
exit
fi
else
echo "请输入数字"
exit
fi
else
echo "请输入数值与运算类型"
exit
fi echo "$num1 $ope $num2: $result"
[ucm@MacBook-Pro testpace]$ ./calc.sh
请输入第一个数字:
请输入第二个数字:
请输入运算类型【+-*/】:+
+ :
[ucm@MacBook-Pro testpace]$ ./calc.sh
请输入第一个数字:
请输入第二个数字:
请输入运算类型【+-*/】:-
- :
[ucm@MacBook-Pro testpace]$ ./calc.sh
请输入第一个数字:
请输入第二个数字:
请输入运算类型【+-*/】:*
* :
[ucm@MacBook-Pro testpace]$ ./calc.sh
请输入第一个数字:
请输入第二个数字:
请输入运算类型【+-*/】:/
/ :
[ucm@MacBook-Pro testpace]$ ./calc.sh
请输入第一个数字:
请输入第二个数字:
请输入运算类型【+-*/】:/
分母不可为0
[ucm@MacBook-Pro testpace]$ ./calc.sh
请输入第一个数字:
请输入第二个数字:
请输入运算类型【+-*/】:/
/ :
[ucm@MacBook-Pro testpace]$ ./calc.sh
请输入第一个数字:
请输入第二个数字:
请输入运算类型【+-*/】:*
* :
[ucm@MacBook-Pro testpace]$

举个例子:判断输入的文件类型

 [ucm@MacBook-Pro testpace]$ cat file.sh
#!/bin/bash read -t -p "please input filename : " file if [ -z "$file" ]
then
echo "必须输入信息"
exit
elif [ ! -e "$file" ]
then
echo "请输入文件名"
exit
elif [ -f "$file" ]
then
echo "$file 是一个普通文件"
elif [ -d "$file" ]
then
echo "$file 是一个目录文件"
else
echo "$file 是其他类型文件" fi
[ucm@MacBook-Pro testpace]$ ./file.sh
please input filename :
必须输入信息
[ucm@MacBook-Pro testpace]$ ./file.sh
please input filename : /home/ucm
/home/ucm 是一个目录文件
[ucm@MacBook-Pro testpace]$ ./file.sh
please input filename : /home/ucm/testpace/file.sh
/home/ucm/testpace/file.sh 是一个普通文件
[ucm@MacBook-Pro testpace]$ ./file.sh
please input filename : dfadasf
请输入文件名
[ucm@MacBook-Pro testpace]

五  多分支case语句

case $变量名 in

  "值1")

    如果变量值等于值1,则执行程序1

    ;;

  “值2”)

    如果变量值等于值2,则执行程序2

    ;;

---省略其他条件分支---

  *)

    如果变量值不是以上的值,则执行此程序

  ;;

esac

举个例子:选项

 [ucm@MacBook-Pro testpace]$ ./case1.sh
consumer choose
cbg choose
ebg choose
请输入你的选择代号:
your choose egb
[ucm@MacBook-Pro testpace]$ ./case1.sh
consumer choose
cbg choose
ebg choose
请输入你的选择代号:
your choose consumer
[ucm@MacBook-Pro testpace]$ ./case1.sh
consumer choose
cbg choose
ebg choose
请输入你的选择代号:
your choose cbg
[ucm@MacBook-Pro testpace]$ ./case1.sh
consumer choose
cbg choose
ebg choose
请输入你的选择代号:
请输入正确的选择!
[ucm@MacBook-Pro testpace]$ cat case1.sh
#!/bin/bash echo "consumer choose 1"
echo "cbg choose 2"
echo "ebg choose 3" read -t -p "请输入你的选择代号:" cho case $cho in
"")
echo "your choose consumer"
;;
"")
echo "your choose cbg"
;;
"")
echo "your choose egb"
;;
*)
echo "请输入正确的选择!"
;;
esac
[ucm@MacBook-Pro testpace]$

六  for循环

  语法一

for 变量 in 值1 值2 值3 值4 ····

  do

    程序

  done

eg:

 [ucm@MacBook-Pro testpace]$ cat for.sh
#!/bin/bash for i in
do
echo $i
done [ucm@MacBook-Pro testpace]$ ./for.sh [ucm@MacBook-Pro testpace]$
 [ucm@MacBook-Pro testpace]$ cat untar-gz.sh
#!/bin/bash
#批量解压缩脚本 cd /home/ucm/testpace
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxvf $i &>/dev/null
done
rm -rf /home/ucm/testpace/ls.log
[ucm@MacBook-Pro testpace]$

上方脚本中tar -zxvf $i &>/dev/null 可以写成tar -zxf $i &>/dev/null 因为在脚本中执行,用户不需要查看输出,所以可以省略v,详细信息不作输出。

  语法二

for ((初始值;循环控制条件;变量变化))

  do

    程序

  done

 [ucm@MacBook-Pro testpace]$ cat add.sh
#!/bin/bash #从1加到100 s=
for((i=;i<=;i++))
do
s=$(( $s + $i ))
done
echo "The sum of 1+2+~~~+99+100 is $s"
[ucm@MacBook-Pro testpace]$ ./add.sh
The sum of ++~~~++ is
[ucm@MacBook-Pro testpace]$
 [ucm@MacBook-Pro testpace]$ cat useradd.sh
#!/bin/bash
#批量添加指定数量的用户 read -p "Please input user name : " -t name
read -t -p "Please input the number of users : " num
read -t -p "Please input the passwd of user : " pass if [ -n "$name" -a -n "num" -a -n "$pass" ]
then
y=$( echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
then
for(( i=;i<=$num;i++ ))
do
/usr/sbin/useradd $name$i &>/dev/null
#用/usr/bin/passwd --stdin接收$pass的信息,给每个用户赋予初始密码
echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
done
else
echo "请输入正整数"
exit
fi
else
echo "input info is null !!!"
exit
fi
[ucm@MacBook-Pro testpace]$ sudo ./useradd.sh
Please input user name : useraa
Please input the number of users :
Please input the passwd of user :
[ucm@MacBook-Pro testpace]$ cat /etc/passwd | grep useraa
useraa1:x::::/home/useraa1:/bin/bash
useraa2:x::::/home/useraa2:/bin/bash
useraa3:x::::/home/useraa3:/bin/bash
[ucm@MacBook-Pro testpace]$

批量删除一般用户

 [ucm@MacBook-Pro testpace]$ cat userdel.sh
#!/bin/bash #批量删除用户 for i in $(cat /etc/passwd | grep -v root | grep "/bin/bash" | cut -f -d ":")
do
userdel -r $i
done
[ucm@MacBook-Pro testpace]$

七  while循环和until循环

while  条件成立,则进行循环

until  条件不成立,则进行循环

while [ 条件判断式 ]

  do

    程序

  done

 [ucm@MacBook-Pro testpace]$ cat whileadd.sh
#!/bin/bash
#从1加到100
i=
s=
while [ $i -le ]
#如果变量i的值小于等于100,则执行循环
do
s=$(( $s + $i ))
i=$(( $i + ))
done
echo "The sum is : $s"
[ucm@MacBook-Pro testpace]$ ./whileadd.sh
The sum is :
[ucm@MacBook-Pro testpace]$

until

 [ucm@MacBook-Pro testpace]$ cat whileadd.sh
#!/bin/bash
#从1加到100
i=
s=
#while [ $i -le ]
#如果变量i的值小于等于100,则执行循环
until [ $i -gt ]
#循环直到变量i的值大于100,则停止循环
do
s=$(( $s + $i ))
i=$(( $i + ))
done
echo "The sum is : $s"
[ucm@MacBook-Pro testpace]$ ./whileadd.sh
The sum is :
[ucm@MacBook-Pro testpace]$

shell条件判断与流程控制的更多相关文章

  1. &lbrack;Shell&rsqb;条件判断与流程控制:if&comma; case&comma; for&comma; while&comma; until

    ---------------------------------------------------------------------------------------------------- ...

  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. JAVA基础学习——1&period;1 环境搭建 之jdk安装,环境变量配置 (系统Win10,64bit)

    大学里虽然老师教过JAVA,但我没学.后来工作了,断断续续的也碰到了JAVA的项目,都是拉过来就干的节奏.也没有好好系统的学习一下. 从今天开始系统学习整理一下JAVA,以后再碰到JAVA项目的时候, ...

  2. 使用UIKit制作卡牌游戏(一)ios游戏篇

    转自朋友Tommy 的翻译,自己只翻译了第三篇教程. 译者: Tommy | 原文作者: Matthijs Hollemans写于2012/06/29 原文地址: http://www.raywend ...

  3. Trace Sys

    ARM片上调试和跟踪解决方案(包括CoreSight体系结构,嵌入式跟踪宏单元(ETM),程序流程跟踪(PTM),ARM调试接口(ADI), 跟踪缓冲器(ETB),嵌入式交叉触发器(CTM)) Cor ...

  4. Linq To Csv 实例简说

    http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library 详细源代码在这里 https://github.com/mperdeck/L ...

  5. c语言经典小程序

    1:题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. mai ...

  6. python之全局变量与局部变量

    全局变量: -   在书写中顶格开始: -   一旦定义完毕在整个文件生效: -   在函数内如果定义了同名全局变量名,会“覆盖”掉全局变量: -   在函数中同名的变量,当在函数退出后消失,全局的同 ...

  7. php 公历阴历互相转换

    <?php /** * Created by PhpStorm. * User: timeless * Date: 17-3-9 * Time: 上午9:32 */ class Lunar { ...

  8. 【转载】SeleniumIDE入门

    http://www.open-open.com/lib/view/open1452488109558.html

  9. 《LINUX内核设计与实现》第三周读书笔记——第一二章

    <Linux内核设计与实现>读书笔记--第一二章 20135301张忻 估算学习时间:共2小时 读书:1.5 代码:0 作业:0 博客:0.5 实际学习时间:共2.5小时 读书:2.0 代 ...

  10. 【Ray Tracing in One Weekend 超详解】 光线追踪1-9 景深

    今天我们来学最后一章 Chapter11:Defocus Blur Preface 散焦模糊 也称 景深 首先,我们来了解一下散焦模糊,我们在真实相机中散焦模糊的原因是因为它们需要一个大圈(而不仅仅是 ...