Shell编程学习(三)条件判断、流程控制

2023-11-08

条件判断

test:类似于if

前面说到过$?可以用来判断上一个命令是否正确执行,我们就用一下这个命令来查看。

  • 等号两边要有空格。
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $a
12
[root@iZwz9hv1phm24s3jicy8x1Z ~]# test $a = 12
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z ~]# test $a=12
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z ~]# test  $a=14
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z ~]# test  $a = 14
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
1

上面每次判断都要用test,我们可以使用[ a = b ],但是要注意这个要求前后必须有空格

[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ $a = 12 ]
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ $a = 102 ]
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
1

前面那种方式是把它当成字符串进行比较的。
对于数字之间的比较我们使用下面的方式进行:

Shell中整数之间的比较

(1)两个整数之间比较

  • -eq 等于(equal)
  • -ne 不等于(not equal)
  • -lt 小于(less than)
  • -le 小于等于(less equal)
  • -gt 大于(greater than)
  • -ge 大于等于(greater equal)
[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 2 -lt 2 ]
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
1
[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 2 -le 2 ]
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 5 -gt 2 ]
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z ~]# [ 5 -gt 22 ]
[root@iZwz9hv1phm24s3jicy8x1Z ~]# echo $?
1

判断文件是否可读可写可执行

  • -r 有读的权限(read) -w 有写的权限(write) -x 有执行的权限(execute)
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -x add.sh ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
1
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -r add.sh ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -w add.sh ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -x third.sh ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0

判断文件

  • -e 文件存在(existence)
  • -f 文件存在并且是一个常规的文件(file)
  • -d 文件存在并且是一个目录(directory)
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls -l
total 16
-rw-r--r-- 1 root root   15 Apr 21 00:04 add.sh
-rwxrwx--- 1 root root  121 Apr 20 23:01 hello.sh
drwxr-xr-x 2 root root 4096 Apr 20 19:59 test
-rwxrwx--- 1 root root   24 Apr 20 20:16 third.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -e add.sh ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -d add.sh ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
1
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -f add.sh ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ -d test ]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0

多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一 条命令执行失败后,才执行下一条命令)

可以把当成三目运算符来进行运算

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ $a = 12 ] && echo $a || echo "a不等于12"
12
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# [ $a != 12 ] && echo $a || echo "a等于12"
a等于12

流程控制

单分支if语句

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ];then echo "OK";fi
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=178
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ];then echo "OK";fi
OK
  • -a:表示and
  • -o:表示or
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . if.sh dongmu
欢迎主人
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . if.sh dongm
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat if.sh 

if [ $1 = dongmu ]
then
	echo "欢迎主人"
fi
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -a $a -lt 35 ]; then echo "可以入职";fi
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=19
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -a $a -lt 35 ]; then echo "可以入职";fi
可以入职
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=38
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -a $a -lt 35 ]; then echo "可以入职";fi
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 -o $a -lt 35 ]; then echo "可以入职";fi
可以入职
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 35 -o $a -lt 18 ]; then echo "不可以入职";fi
不可以入职
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a
38
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=34
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 35 -o $a -lt 18 ]; then echo "不可以入职";fi

多分支if语句

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15";  fi;
大于18
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15"; else echo "小 于15"; fi; 
大于18
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=16
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15"; else echo "小 于15"; fi; 
大于15
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=13;
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if [ $a -gt 18 ]; then echo "大于18"; elif [ $a -gt 15 ]; then echo "大于15"; else echo "小 于15"; fi; 
小于15
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . if.sh dongmu 12
欢迎主人
add.sh hello.sh if.sh test third.sh
您还是孩子
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat -n if.sh 
     1	
     2	if [ $1 = dongmu ]
     3	then
     4		echo "欢迎主人"
     5	fi
     6	
     7	echo ****************
     8	
     9	
    10	if [ $2 -gt 18 -a $2 -lt 45 ]
    11	then echo "你正值壮年"
    12	elif [ $2 -gt 45 ]
    13	then echo "您已经人到中年"
    14	else echo "您还是孩子"
    15	fi	

case条件判断语句

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim case.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . case.sh 1
您1岁了
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . case.sh 2
您两岁了
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . case.sh 12
您已经长大了
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat -n case.sh
     1	
     2	case $1 in
     3		"1") echo "您1岁了";;
     4		"2") echo "您两岁了";;
     5		*) echo "您已经长大了";;
     6	esac

循环流程控制

  • 第一种for循环的方式
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat -n for.sh 
     1	sum=0
     2	for((i=0;i<10;i++))
     3	do
     4		sum=$[$sum+$i]
     5		echo $sum
     6	done
     7	
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . for.sh 
0
1
3
6
10
15
21
28
36
45

我们之前说linux里面不能用<小于>大于,但是这里可以用,是因为在双小括号里面,在双小括号里面是可以用的。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# if((9>8));then echo OK;fi;
OK
  • 第二种for循环的方式
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# for os in linux windows ios ;do echo $os;done
linux
windows
ios

对于这第二种枚举所有的情况,有时候数据可能很多,我们可以直接使用{起始值..终止值}即可

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sum=0;for a in {1..10};do sum=$[$a+$sum];echo $sum;done
1
3
6
10
15
21
28
36
45
55

之前我们学习过,$*$@一个是整体,一个是每一部分,下面我们进行测试

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim for.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat for.sh 
for a in $@
do echo $a
done

echo '**********************'

for b in $*
do echo $b
done
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . for.sh 1 2 3 4 5 
1
2
3
4
5
**********************
1
2
3
4
5

  • 这个看似好像没有区别,但是再看如果被引号引起来之后呢
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . for.sh 1 2 3 4 5 
1
2
3
4
5
**********************
1
2
3
4
5
**********************
1
2
3
4
5
**********************
1 2 3 4 5
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat for.sh 

for a in $@
do echo $a
done

echo '**********************'

for b in $*
do echo $b
done

echo '**********************'
for a in "$@"
do echo $a
done

echo '**********************'

for b in "$*"
do echo $b
done

这个时候就可以发现$*被当成了整体。

while循环语句

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim while.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./while.sh 
55
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat while.sh 
sum=0
a=1
while [ $a -le 10 ]
do sum=$[ $a+$sum ]
	a=$[ $a+1 ]
done
echo $sum

下面这种方式也可以
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim while.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./while.sh 
10
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat while.sh 
sum=0
a=1
while [ $a -le 10 ]
# do sum=$[ $a+$sum ]
#	a=$[ $a+1 ]
do
	let sum=a;
	let a++;
done
echo $sum

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell编程学习(三)条件判断、流程控制 的相关文章

随机推荐

  • 部署mac os渗透测试环境

    一 序言 每次重装系统后配置环境都是需要耗费大量时间 特此写一篇mac os部署渗透测试环境 二 过程 一 系统设置 1 常用设置 SSD 开启 TRIM 支持 sudo trimforce enable APP安装开启任何来源 sudo
  • Lua coroutine.create

    Lua coroutine creat 相当于在C 中使用lua newthread Equivalent of Lua coroutine create in C using lua newthread 问 题 I have a call
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十)面剔除

    Vries的教程是我看过的最好的可编程管线OpenGL教程 没有之一 其原地址如下 https learnopengl cn github io 04 20Advanced 20OpenGL 04 20Face 20culling 关于面剔
  • # HTB-Tier2- Vaccine

    HTB Tier2 Vaccine Web Network Vulnerability Assessment Databases Injection Custom Applications Protocols Source Code Ana
  • 毕业设计 基于Arduino的计算器

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • 暑期实训日志11——webstorm+chrome实时浏览插件

    在网上看到一个webstorm chrome里JetBrains IDE Support能够实现实时浏览的小工具 感觉非常实用 一 JetBrains IDE Support下载 下载地址 直接从谷歌商店下载也可 前提是进得去 下载好后打开
  • sqli-labs(28-28a)

    Less 28 1 测试http 127 0 0 1 sqli labs Less 28 id 1 27 页面回显不正常 但又没有错误提示 报错注入没戏 尝试闭合语句 加单引号回显不正常 说明sql语句闭合至少有 可能有 判断有无 在Les
  • log4cplus基础知识

    一 简介 log4cplus是C 编写的开源的日志系统 具有线程安全 灵活 以及多粒度控制的特点 通过将信息划分优先级使其可以面向程序调试 运行 测试 和维护等全生命周期 你可以选择将信息输出到屏幕 文件 NT event log 甚至是远
  • SSM controller要能跳转页面又要能返回字符串

    SpringMVC因为添加了下面这个bean 视图解析器 当你方法返回的是 json 字符串等其它值时 会404 跳转 jsp jsp页面
  • 回文数的判断

    文章目录 题目 一 方案一 二 方案二 三 方案三 四 方案四 题目 判断一个整数是否是回文数 回文数是指正序 从左向右 和倒序 从右向左 读都是一样的整数 提示 下面案例可供参考 一 方案一 public boolean palindro
  • 二叉树 深度优先搜索(DFS)、广度优先搜索(BFS)

    深度优先搜索算法 Depth First Search DFS是搜索算法的一种 它沿着树的深度遍历树的节点 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 搜索将回溯到发现节点v的那条边的起始节点 这一过程一直进行到已发现从源节点可达
  • pytorch Embedding模块,自动为文本加载预训练的embedding

    pytorch 提供了一个简便方法torch nn Embedding from pretrained 可以将文本与预训练的embedding对应起来 词 embedding word1 0 2 3 4 word2 1 2 3 4 word
  • Pytorch(六)(模型参数的遍历) —— model.parameters() & model.named_parameters() & model.state_dict()

    神经网络的模型参数 model parameters model named parameters model state dict 这三个方法都可以查看神经网络的参数信息 用于更新参数 或者用于模型的保存 作用都类似 写法略有出入 就以P
  • 爬虫技术研究综述

    爬虫技术研究综述 整理 Ackarlix 挨踢网 中文IT技术社区 http www aitic net 引言 随着网络的迅速发展 万维网成为大量信息的载体 如何有效地提取并利用这些信息成为一个巨大的挑战 搜索引擎 Search Engin
  • react运行项目出现报错:process is not defined

    具体报错效果 导致页面完全不能动弹 点击按钮没有效果 解决方式 首先删除 package lock json 文件夹 然后执行命令 npm install react error overlay 6 0 9 最后重新启动项目
  • End-to-End Object Detection with Transformers[DETR]

    End to End Object Detection with Transformers DETR 背景 概述 相关技术 输入 提取特征 获取position embedding transformer encoder decoder 回
  • C++ 学习笔记(17)tuple类型、bitset类型、随机数(引擎和分布)、IO库(操纵符、未格式化输入输出、随机访问)

    C 学习笔记 17 tuple类型 bitset类型 随机数 引擎和分布 IO库 操纵符 未格式化输入输出 随机访问 参考书籍 C Primer 5th 17 1 tuple 类型 17 1 1 定义和初始化tuple tuple 的构造函
  • 极路由 1s HC5661 玩转 openwrt

    注意 我的极路由1s是老版本的 是不带A的 安装篇 1 安装breed 根据这篇文章安装breed 成功后你就拥有了一台刷不死的路由器 2 下载openwrt系统 在这个网站可以下载 选择HC5661的版本 3 断电 按住reset键 上电
  • 在字符串中删除特定字符

    题目 在字符串中删除特定字符 删除后字符串变为 hi i a 即将原串中包含t e s中的都删除掉了 分析 方法 1 从头扫描原串 每遇到一个字符 在要删的串中比一遍 有的话就删除当前字符 然后继续下一个字符的判断 方法 2 由于方法 1
  • Shell编程学习(三)条件判断、流程控制

    条件判断 test 类似于if 前面说到过 可以用来判断上一个命令是否正确执行 我们就用一下这个命令来查看 等号两边要有空格 root iZwz9hv1phm24s3jicy8x1Z echo a 12 root iZwz9hv1phm24