当前位置: 首页 > news >正文

学会用bash在linux写脚本 (二)

接着上一章继续

  • 数值的对比
  • 判断语句
  • 循环语句
22.5 比较、对比、判断
在写脚本时,有时需要做一些比较,例如,两个数字谁大谁小,两个字符串是否相同等。
做对比的表达式有[]、[[]]、test,其中[]和 test这两种表达式的作用是相同的。[[]]和[]的不同
在于,[[]]能识别通配符和正则表达式中的元字符,[]却不能。
需要注意的是,在比较时,中括号和后续提及的比较符两边都要留有空格。
22.5.1数字的比较
数字的比较,主要是比较两个数字谁大谁小,或者是否相同。能用到的比较符有以下几
种。
(1)-eq:相等。
(2)-ne:不相等。
(3)-gt:大于。
(4)-ge:大于等于。
(5)-lt:小于。
(6)-le:小于等于。
做完比较之后,通过返回值来判断比较是否成立。
练习1:判断1等于2,命令如下。
[root@pp yy]# [ 1 -eq 2 ]
[root@pp yy]# echo $?
1
[root@pp yy]# 
1是不能等于2的,所以判断不成立,返回值为非零。注意中括号和比较符两边的空格。
练习2:判断1不等于2,命令如下。
[root@pp yy]# [ 1 -ne 2 ]
[root@pp yy]# echo $?
0
[root@pp yy]# 
1不等于2,所以判断成立,返回值为0
22.5.2 字待串的比较
字符串的比较,一般是比较两个字符串是否相同,用得较多的比较符有以下两种。
(1)==:相同。
(2)!=:不相同。
做完比较之后,通过返回值来判断比较是否成立。
练习1:定义一个变量aa=tom,然后做判断,命令如下。
[root@pp yy]# aa=tom
[root@pp yy]# [ $aa == tom ]
[root@pp yy]# echo $?
0
[root@pp yy]# 
变量aa的值和 tom完全相同,所以判断成立,返回值为0。
练习2:在判断中匹配通配符,命令如下。
[root@pp yy]# aa=tom
[root@pp yy]# [ $aa == to? ]
[root@pp yy]# echo $?
1
[root@pp yy]# 
这里定义aa=tom,按照前面讲过的通配符,to?匹配的应该是前两个字符为to,第三个
可以是任意字符,所以 tom应该会被to?匹配到,为什么返回值为非零呢?
原因在于在这一对中括号[]中是不能识别通配符的,aa的值是t、o、m三个字符,而等号
后面是t、o、?这三个字符,并没有把问号当成通配符,所以判断不成立。
如果想识别通配符,那么就要用双中括号[[]],看下面的判断。
[root@pp yy]# aa=tom
[root@pp yy]# [[[ $aa == to? ]]
[root@pp yy]# echo $?
0
[root@pp yy]# 
在[[]]中能识别通配符“?”,所以这里判断成立,返回值为0。
注意
(1)==后面跟的是通配符,如果想跟正则表达式,比较符就不能使用==了,要换成=~。
(2)一定要注意中括号和比较符两边的空格。
22.5.3 属性的判断
属性的判断,用于判断一个文件是否具备某个属性,常见的属性包括以下7种。
(1)-r:具备读权限。
(2)-w:具备写权限。
(3)-x:具备可执行权限。
注意
以上三个属性,不管是出现在u、g还是o上,只要有就算判断成立。
()-d:一个目录。
()-l:一个软链接。
()-f:一个普通文件,且要存在。
()-e:不管什么类型的文件,只要存在就算判断成立。
练习1:判断/etc/hosts具备r权限,命令如下。
[root@pp yy]# ls -l /etc/hosts 
-rw-r--r--. 1 root root 158 9月  10 2018 /etc/hosts
[root@pp yy]# [ -r /etc/hosts ]
[root@pp yy]# echo $?
0
[root@pp yy]# 
通过第一条命令可以看到/etc/hosts是具备r权限的,判断/etc/hosts具备r权限,自然成
立,所以返回值为0。
练习2:判断/etc/hosts具备x权限,命令如下。
[root@pp yy]# [ -x /etc/hosts ]
[root@pp yy]# echo $?
1
[root@pp yy]# 
22.5.4 使用连接符
前面讲的判断只是单个判断,如果要同时做多个判断,那么就需要使用连接符了。能用的
连接符包括“&&”和“||”。
先看一下使用&&作为连接符,用法如下。
1 判断1 && 判断2
只有两个判断都为真(返回值为0),整体才为真,只要有一个为假,整体就为假。判断1
如果为假,判断2还有必要执行吗?没有,因为整体已经确定为假了。判断1为真,整体是真
是假在于判断2,所以判断2肯定是要执行的。
[root@pp yy]# [ 1 -le 2 ] && [ 2 -ge 3 ]
[root@pp yy]# echo $?
1
[root@pp yy]# 
下面看使用||作为连接符,用法如下。
两个判断只要有一个为真(返回值为0),整体就为真,只有全都为假,整体才为假。
判断1为真,整体已经确定为真,所以判断2没有必要执行。
判断1为假,整体是真是假在于判断2,所以判断2肯定是要执行的。
[root@pp yy]# [ 1 -le 2 ] || [ 2 -ge 3 ]
[root@pp yy]# echo $?
0
[root@pp yy]# 
这里有两个判断,第一个判断是1小于等于2,这个判断成立,整体已经确定为真,所以
整个判断为真,返回值为0。
22.6 if判断语句
在脚本中执行某条命令需要满足一定的条件,如果不满足就不能执行。此时我们就要用到
判断语句了。
先看if判断,if判断的语法如下。
1 if 条件1 ; then
2 命令1
3 elif 条件2 ; then
4 命令2
5 else 命令3
6 fi
先判断if后面的判断是不是成立。
如果成立,则执行命令1,然后跳到f后面,执行6后面的命令。
如果不成立,则不执行命令1,然后判断elif后面的条件2是不是成立。
如果成立,则执行命令2,然后跳到f后面,执行f后面的命令。
如果不成立,则不执行命令2,进行下一轮的elif 判断,以此类推。
如果所有if和elif都不成立,则执行clse中的命令3。
练习1:写一个脚本/opt/sc1.sh,要求只有root用户才能执行此脚本,其他用户不能执
行,命令如下。
[root@pp opt]# cat sc1.sh 
#/bin/bash
if [ $UID ‐ne 0 ]; then
echo "只有root才能执行此脚本"
exit 1
fi
echo "hello root"
[root@pp opt]# 
[root@pp opt]# chmod +x /opt/sc1.sh 
脚本分析如下。
root的uid是0,其他用户的uid不为0。第一个判断,如果uid不等于0,则打印警告信
息“只有root才能执行此脚本”,然后exit退出脚本。
如果这里不加 exit,判断之后仍然会继续执行echo "hello root"命令,这样判断就失去
了意义。只有加了exit之后,如果不是root,则到此结束,不要继续往下执行了。
如果是blab 执行此脚本,则判断成立,打印完警告信息之后,通过exit退出脚本。
如果是 root执行此脚本,则判断不成立,直接执行f后面的命令。
使用root用户执行此脚本的结果如下。
[root@pp opt]# ./sc1.sh 
hello root
[root@pp opt]# 
使用iu用户执行此脚本的结果如下。
[iu@pp opt]$ ./sc1.sh 
只有root才能执行此脚本
[iu@pp opt]$ 
22.7 for循环语句
      有时我们需要做多次重复的操作,例如,创建100个用户,创建一个用户需要两条命
令:useradd和 passwd。那么,创建100个用户就要重复执行100次,总共执行200条命令,
此时我们就可以利用for循环简化操作,让系统自动帮我们重复运行即可。
        for循环的语法如下。
1 for 变量 in 值‐1 值‐2 值‐3 值‐4 ; do
2 命令 $变量
3 done
这里首先把值-1赋值给变量,执行do和done之间的命令,所有命令执行完成之后,再把
值-2赋值给变量,执行do和done之间的命令,执行完所有命令之后,再把值-3赋值给变
量,以此类推,直到把所有的值都赋值给变量。
看一个简单的例子,如下所示。
[iu@pp opt]$ for i in 1 2 3 4 ; do
> let i=$i+10
> echo $i
> done
11
12
13
14
[iu@pp opt]$ 
这里for后面定义了一个变量i,在in后面指定了4个值,分别是1、2、3、4。在do和done
之间定义了两个命令,第一个是在变量i的原有值的基础上加上10,然后打印i的值。
先把1赋值给i,此时i的值为1,执行do和 done之间的命令。i加上10之后,i的值变为了
11,然后打印i,得到11,第一次循环结束。
然后把2赋值给i,此时i的值为2,执行do和done之间的命令。i加上10之后,i的值变为了
12,然后打印i,得到12,第二次循环结束。
22.8 while 循环语句
while也可以循环,while循环的语法如下。
1 while 判断 ; do
2 命令1
3 命令2
4 done
如果while后面的判断成立,则执行do和 done之间的命令,在最后一个命令执行完成之
后,会回头再次判断一下while后面的判断是不是成立。如果不成立,则跳出循环执行done后
面的命令;如果成立,则继续执行do和 done之间的命令,就这样循环下去。
先看一个简单的例子,写一个脚本/opt/sc3.sh,命令如下。
[root@pp opt]# cat sc3.sh 
#!/bin/bash
declare ‐i n=1
while [ $n -le 4 ] ; do
echo $n
let n=$n+1
done
[root@pp opt]# 
[root@pp opt]# chmod +x /opt/sc3.sh 
脚本分析如下。
这里先通过declare -i n=1定义了一个整数类型的变量n,初始值为1。然后进入 while进
行循环,先判断$n的值是不是小于等于4,如果成立,则执行do和 done之间的命令。
一开始$n的值为1,[ $n -le 4 ]这个判断成立,则进人 do和done之间执行命令。首先打
印Sn的值,然后在此基础上给n 加上1,所以n的值变为了2,这样do和done之间的命令就 执行完成了。然后再次到while后面进行判断,此时$n的值为2,依然满足小于等于4,再次
执行do 和 done之间的命令。
如此反复,当$n的值最终能增加到4时打印,然后加1,此时n的值变为了5。当Sn的值变
为5之后,while后面的判断就不再成立了,此时会跳出 while循环。
用while也可以用于循环一个文件的内容,用法如下。
1 while read aa ; do
2 命令
3 done < file
这里read后面的变量aa是可以随意指定的,整体的意思是首先读取file的第一行内容赋值
给aa,执行do和 done之间的命令。然后读取file的第二行内容赋值给aa,执行do和done
之间的命令,直到读取到file的最后一行。
有时while需要一直循环下去(死循环),语法如下。
1 while true ; do
2 命令
3 done

1 while ((1)) ; do
2 命令
3 done

1 while : ; do
2 命令
3 done
下面写一个脚本,来实时判断vsftpd是否启动,如果没有启动,则将vsftpd启动,命令如
下。
[root@pp opt]# cat sc4.sh 
#!/bin/bash
while : ; do
systemctl is‐active vsftpd &> /dev/null
if [ $? -ne 0 ]; then
systemctl start vsftpd
fi
sleep 1
done
[root@pp opt]# 
[root@pp opt]# chmod +x sc4.sh 
这里写了一个 while循环,可以一直循环下去,循环中先判断vsftpd是否启动,如果启动
了则返回值为0,如果没有启动则返回值为非零。
下面开始根据返回值来进行判断,如果$?不等于0,说明vsftpd没有启动,则启动vsftpd
服务。sleep 1的意思是暂停1秒,这样就实现了每隔1秒来判断一次vsfilpd是否启动。
下面开始测试这个脚本,先把脚本放在后台运行,命令如下。
[root@pp opt]# ./sc4.sh &
[1] 3788
测试当前vsftpd 的状态,命令如下。
[root@pp opt]# systemctl is‐active vsftpd
active
[root@pp opt]#
关闭vsftpd服务之后,再次检测vsftpd 的状态,命令如下。
[root@pp opt]# systemctl stop vsftpd
[root@pp opt]# systemctl is‐active vsftpd
active
[root@pp opt]#
可以看到,vsftpd 仍然是启动的,说明我们的脚本生效了。  

相关文章:

学会用bash在linux写脚本 (二)

接着上一章继续 数值的对比 判断语句 循环语句 22.5 比较、对比、判断 在写脚本时&#xff0c;有时需要做一些比较&#xff0c;例如&#xff0c;两个数字谁大谁小&#xff0c;两个字符串是否相同等。 做对比的表达式有[]、[[]]、test&#xff0c;其中[]和 test这两种表达式的…...

QML中Dialog获取close与open状态

1.新建MyDialog.qml import QtQuick 2.15import QtQuick.Dialogs 1.2Dialog {id: rootvisible: falsetitle: qsTr("弹出对话框")width: 250height: 200} 2.main.qml中调用MyDialog import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15…...

用C语言实现队列的顺序结构

用C语言实现队列的初始化、队列的判空操作、入队操作、出队运算、取队头元素运算、顺序打印队列。 #include<stdio.h> #define QueueSize 100 typedef char ElemType; typedef struct//队列结构体 {ElemType data[QueueSize];//保存队中元素int front, rear;//队头和队尾…...

Vue 子路由页面发消息给主路由页面 ,实现主页面显示子页面的信息

需求 子页面进入后&#xff0c;能在主页面显示子页的相关信息&#xff0c;比如说主页面的菜单激活的是哪个子页面的菜单项 如上图&#xff0c;当刷新浏览器页面时&#xff0c;让菜单的激活项仍保持在【最近浏览】。 实现方式&#xff1a; 在子页面的create事件中增加&#xff…...

AR技术详解

1.AR技术平台 1.手机端 2.AR眼镜端 3.WebAR。 2.AR基础技术应用 1.平面检测技术 2.模型识别技术 3.图片识别技术 4.AR云&#xff08;云锚点&#xff09;技术 5.人脸检测技术 3.主要AR技术SDK 1.苹果ARKit&#xff0c;谷歌ARCore。 优点&#xff1a;推荐使用Unity开发&#xf…...

h5或uniapp或微信小程序,实现左上角返回到指定页面,侧滑左滑返回指定页面,安卓物理返回键返沪指定页面解决思路的思考

h5或uniapp或微信小程序&#xff0c;实现左上角返回到指定页面&#xff0c;侧滑左滑返回指定页面&#xff0c;安卓物理返回键返沪指定页面 uniapp开发app,(非微信小程序)uniapp写的微信小程序 uniapp开发app,(非微信小程序) 自定义的左上角返回按钮 <i class"iconfon…...

轻量封装WebGPU渲染系统示例<43>- PBR材质与阴影实(源码)

原理简介: 1. 基于rendering pass graph实现。 2. WGSL Shader 基于文件系统和宏机制动态组装。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/PBRShadowTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&a…...

macOS Big Sur/Mac电脑安装vscode显示您没有权限来打开应用程序‘Visual Studio Code‘ 请联系您的电脑或网络管理员问题修复

错误方法 首先我以为我的权限不足。&#xff0c;需要去用户群组里设置。结果根本不是这个的问题。 1.在系统偏好设置->用户与群组检查了一下我的用户是不是管理员 结果发现是管理员 2.根据苹果提示&#xff0c;右键我的文件夹->显示简介->最下面的共享与权限 解锁&…...

jsp 如何批量改随机人名

对比图 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <%page import"java.sql.ResultSet"%> <%page import"java.sql.PreparedStatement"%> <%page import&qu…...

android项目实战之编辑器集成

引言 项目需要用到编辑器&#xff0c;采用RichEditor&#xff0c;如下效果 实现 1. 引入库2 implementation jp.wasabeef:richeditor-android:2.0.0 2. XML <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width&q…...

JAVA程序如何打jar和war问题解决

背景: 近期研究一个代码审计工具 需要jar包 jar太多了 可以将jar 打成war包 首先看下程序目录结构 pom.xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"ht…...

Microsoft 365 Copilot正式上线,如何稳定访问体验?

如果将微软对人工智能的投资看成一场豪赌&#xff0c;Microsoft Copilot无疑是现阶段最受瞩目的赌注。2023年9月正式发布的Microsoft Copilot是一种基于大型语言模型&#xff08;LLM&#xff09;和微软图形&#xff08;Microsoft Graph&#xff09;的数据和人工智能&#xff08…...

【安卓】安卓xTS之Media模块 学习笔记(3) VTS测试

1. 背景 接下来进行正式的VTS测试。本章节还是以Media模块相关进行介绍。 VTS主要测的是内核和HAL层&#xff0c;media的hal层是以openMax&#xff08;即将废弃&#xff0c;今日2023.12&#xff09; 和 Codec2 (后续主流) 接口为主。 这里我们只看Codec2的要求&#xff0c;CDD…...

Go实现http同步文件操作 - 增删改查

http同步文件操作 - 增删改查 http同步文件操作 - 增删改查1. 前置要求1.1. 构建结构体 文件名 文件内容1.1.1. 页面结构体1.1.2. 为Page结构体绑定方法&#xff1a;Save1.1.3. 对Page结构体支持页面内容查看方法&#xff0c;同时提供页面文件是否存在的方法 1.2. 简单验证上面…...

Spring Boot整合 Spring Security

Spring Boot整合 1、RBAC 权限模型 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09; 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限&#xff0c;它们之间的关系如下图所示 SELECT…...

浅谈低代码

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美以下方向仅供参考。味的膳食还是垃圾…...

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识&#xff0c;但是都是基于理论原理知识理解&#xff0c;今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程&#xff1a;【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…...

Echarts的使用 笔记

1.数据可视化前言 1.1.什么是数据可视化 数据可视化&#xff1a; 就是把数据以更加直观的方式进行呈现. 1.2.数据可视化的好处 清晰有效地传达与沟通信息更容易洞察隐藏在数据中的信息 2.ECharts的基本使用 2.1.ECharts官网 ECharts是百度公司开源的一个使用 JavaScript 实…...

信息系统工程的基本概念

系统是由相互作用和相互依赖的若干部分&#xff0c;按一定规律结合成的、具有特定功能的有机整体。系统有下述特性&#xff1a; &#xff08;1&#xff09;集合性。系统是由许多元素有机地组成的整体。每个元素服从整体&#xff0c;追求全局最优。 &#xff08;2&#xff09;相…...

SAP UI5 walkthrough step10 Descriptor for Applications

在这一步&#xff0c;我们将会把所有的应用相关的描述性的文件独立放到manifest.json 新建一个manifest.json文件 webapp/manifest.json (New) {"_version": "1.58.0","sap.app": {"id": "ui5.walkthrough","i18n&q…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...