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

Shell脚本:条件语句(if、case)

目录

硬编码

硬编码的缺点

条件判断

$?

命令行语句

判断指定目录是否存在

判断指定文件是否存在

判断指定对象是否存在

表达式形式语句

判断对象是否存在

判断对象是否有权限

与、或、非 运算

与运算

或运算

非运算

比较大小

判断磁盘利用率实验步骤

字符串比较

逻辑表达式

if 语句

单分支结构

语法格式

语句原理

单分支if语句示例操作步骤

双分支结构

语法格式

语句原理

连通性测试实例操作步骤

多分支结构

语法格式

语句原理

多分支if语句示例操作步骤

case语句

语法格式

语句原理

case语句示例操作步骤

模拟sleep服务实例操作步骤

注册为系统服务调用脚本

服务管理方式

systemctl

service


硬编码

硬编码(Hard Coding)是指在程序代码中直接使用固定值,而不是通过变量、配置文件或参数来动态获取这些值

比如在脚本中写入一个ping命令,目标的IP地址固定为192.168.10.101(直接嵌入常量或固定逻辑),这就是硬编码

硬编码的缺点

  1. 难以维护:当需要修改硬编码的值时,需要直接修改源代码,并重新编译、部署应用。这增加了出错的风险和维护成本。
  2. 缺乏灵活性:硬编码使得程序在不同环境中运行时缺乏灵活性。例如,开发环境和生产环境的配置可能不同,如果使用硬编码,就需要为每个环境分别修改代码。
  3. 可读性和可管理性差:随着项目规模的增大,硬编码会导致代码难以阅读和管理,特别是当这些值分散在多个文件和模块中时。

条件判断

$?

检查上一个指令执行的结果状态

echo $?

如果状态正常就返回0

如果状态不正常就显示非0

命令行语句

判断指定目录是否存在

使用 test -d 目录路径 来判断指定目录是否存在

并使用echo $? 命令检测命令执行状态,非0表示不正常

判断指定文件是否存在

test -f 文件路径 判断文件是否存在

判断指定对象是否存在

表达式形式语句

判断对象是否存在

判断对象是否有权限

  • -r:读权限
  • -w:写权限
  • -x:执行权限

与、或、非 运算

逻辑运算符

与运算

当前一个条件成立时,执行命令

示例:[ $USER = root ] && echo "当前用户为root"

解析:当用户为root时,在终端上输出“当前用户为root”

或运算

只要有一方的条件满足,就执行命令

如果两个文件只有file1存在那么结果为真(true),如果两个文件只有file2存在结果为真(true)

如果两个文件都不存在,结果为假(false)

if [ -f "$file1" ] || [ -f "$file2" ]; thenecho "文件存在!"
elseecho "文件不存在!"
fi
非运算

非运算会将 true 变为 false,将 false 变为 true

示例:[ ! -d /opt/test.txt ] && echo "该文件不是目录"

解析:如果指定的文件 不是目录,就在终端显示“该文件不是目录”

配合 = 就是 !=:不等于

示例:[ $USER != root ] && echo "当前用户不为root"

比较大小

运算符

说明

eq

等于(equal)

ne

不等于(not equal)

gt

大于(greater)

ge

大于等于(greater or equal)

lt

小于(less)

le

小于等于(less or equal)

判断磁盘利用率实验步骤

通过 df 命令 并使用 grep 管道符和 awk 获取根分区行内容的利用率的一列

再添加一个管道符 指定%为分隔符 结果只剩下利用率的数字

再将该命令的结果赋值给一个变量,接下来就可以做判断的操作了

通过表达式实现判断,可以看到结果是否,那么我们就可以通过判断的结果使用 if 语句来

字符串比较

使用表达式判断

需要注意的是,语法格式是有要求的

逻辑表达式
  • &&(与运算):条件1 && 条件2
    • 如果条件1执行成功,也执行条件2

if 语句

if:如果

如果判断的条件成立,就执行指定的命令

单分支结构

语法格式

语句原理

单分支if语句示例操作步骤

cd 到 /opt 目录下创建一个脚本文件

文件内容如下

新建一个用户并设置密码,然后登录该用户

使用tom的身份执行此脚本就成立了我们指定的条件(不是root用户),状态码也指定为了100

并且后续的 ls /opt命令没有执行,因为前一条语句没有执行成功

双分支结构

语法格式

语句原理

连通性测试实例操作步骤

新建编辑一个脚本文件

写入内容如下

指定ping命令的请求次数、间隔时间、超时时间,和添加位置参数

/dev/null 是“黑洞文件”,作用是任何写入到该文件的数据都会被丢弃,在当前脚本下的作用是丢弃标准输出和错误的输出信息,效果是不会在终端显示

测试执行该脚本,得到结果如下

如果在巡检时有上百上千台机器需要做连通性测试呢?

就可以编辑一个 主机列表 把所有主机的IP地址写进去,再将该列表引用到脚本里,让脚本通过该列表获取每个IP地址,逐个测试,实现自动化

多分支结构

语法格式

语句原理

多分支if语句示例操作步骤

新建编辑脚本文件,输入以下内容

保存并退出,测试该脚本

case语句

case:情况

语法格式

语句原理

case语句示例操作步骤

新建编辑脚本文件并写入以下内容

或通过 |(或运算),两个范围同时判断

模拟sleep服务实例操作步骤

新建编辑脚本文件输入以下内容

增加执行权限

需要注意的是使用相对路径时,在执行脚本内部的$0命令会找不到test03脚本文件,因为 $0 仅包含脚本名而不包含脚本文件的路径

而使用绝对路径调用时,$0就包含了调用文件时输入的绝对路径,所以在执行脚本内部的$0命令时就能找得到脚本文件了

注册为系统服务调用脚本

修改脚本文件,增加必须的规则(chkconfig)

35:开机自启的运行级别(3、5),也可以写为 "-" 表示所有运行级别

80:启动优先级(当系统启动时,开机自启的优先级,数字越大,优先级越低)

20:关闭优先级(关闭系统时,关闭服务的优先级)

再将文件拷贝到指定位置

在脚本中加入了chkconfig规则就可以通过chkconfig命令将脚本注册为系统服务

注册为系统服务后,就可以通过service命令对该服务进行操作

系统启动时自动运行该服务

服务管理方式

  • systemctl

    • 串行启动
    • 如果系统的守护进程是systemd,管理系统服务的就是 systemctl
      • systemctl start|stop|restart|reload|status|enable|disable httpd
      • systemctl 选项 服务名称
  • service

    • 并行启动
    • 如果系统的守护进程是init,管理系统服务的就是 service 管理(在CentOS 7往后,系统内的init是systemd的链接)
      • service httpd start|stop|restart|reload|status
      • service 服务名称 选项
    • 通过chkconfig 服务名 on 将该服务设为开机自启
    • 需要将脚本文件放置在 /etc/init.d/ 目录下
    • 该脚本需要有执行权(chmod +x)

相关文章:

Shell脚本:条件语句(if、case)

目录 硬编码 硬编码的缺点 条件判断 $? 命令行语句 判断指定目录是否存在 判断指定文件是否存在 判断指定对象是否存在 表达式形式语句 判断对象是否存在 判断对象是否有权限 与、或、非 运算 与运算 或运算 非运算 比较大小 判断磁盘利用率实验步骤 字符串…...

在Linux上为Windows目标配置Qt交叉编译

问题描述 我想使用Linux x86_64主机为Windows x86_64目标交叉编译Qt库(最终也包括我的应用程序)。我觉得自己已经接近成功了,但可能对整个过程有一些基本的误解。 我从在我的Fedora机器上安装所有mingw包开始,并修改了win32-g的…...

Introduction to linear optimization 第 2 章课后题答案 11-15

线性规划导论 Introduction to linear optimization (Dimitris Bertsimas and John N. Tsitsiklis, Athena Scientific, 1997), 这本书的课后题答案我整理成了一个 Jupyter book,发布在网址: https://robinchen121.github.io/manual-introdu…...

Java——包

一、包 1、简要介绍 在Java编程语言中,包(Package) 是一种用来组织和管理类(Class)和接口(Interface)的机制。包为开发者提供了一种逻辑分组的方式,使代码更加模块化、结构化和易于…...

Pipeline知识小记

在scikit-learn(通常缩写为sklearn)中,Pipeline是一个非常重要的工具,它允许你将多个数据转换步骤(如特征选择、缩放等)和估计器(如分类器、回归器等)组合成一个单一的估计器对象。这…...

postman国内外竞争者及使用详解分析

一、postman简介 Postman 是一款广泛使用的 API 开发和测试工具,适用于开发人员和测试人员。它提供了一个直观的界面,用于发送 HTTP 请求、查看响应、创建和管理 API 测试用例,以及自动化 API 测试工作流程。以下是 Postman 的主要功能和特点…...

人工智能对决:ChatGLM与ChatGPT,探索发展历程

图: a robot is writing code on a horse, By 禅与计算机程序设计艺术 目录 ChatGLM:...

探索Python元类的奥秘及其应用场景

探索Python元类的奥秘及其应用场景 一、引言 在Python中,元类(Metaclasses)是一个相对高级且容易被忽视的主题。然而,对于深入理解Python的面向对象编程模型以及进行高级框架和库的设计来说,元类是一个不可或缺的工具…...

C语言基础关键字的含义和使用方法

​关键字在C语言中扮演着非常重要的角色,它们定义了语言的基本构造和语法规则,通过使用关键字,开发者可以创建变量、定义数据类型、控制程序流程(如循环和条件判断)、声明函数等。由于这些字是保留的,所以编…...

【Golang - 90天从新手到大师】Day09 - string

系列文章合集 Golang - 90天从新手到大师 String 一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,但是通常是用来包含人类可读的文本。 len()返回字符串字节数目(不是rune数)。 通过索引可以访问某个字节值,0…...

网络安全与区块链技术:信任与安全的融合

# 网络安全与区块链技术:信任与安全的融合 在网络空间,信任是一种宝贵而稀缺的资源。区块链技术以其独特的分布式账本、加密算法和共识机制,为构建网络安全提供了新的解决方案。本文将探讨网络安全与区块链技术如何融合,以增强信…...

MySQL之复制(九)

复制 复制管理和维护 确定主备是否一致 在理想情况下,备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误,备库同样可能因为MySQL自身的特性导致数据不一致,例如MySQL的Bug、网络中断、服务…...

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现 1、HashSet 的底层实现2、 HashSet 的特点3、 总结 💖The Begin💖点点关注,收藏不迷路💖 HashSet 是 Java 集合框架中的一个重要成员,它提供了不存储重复元素的集合。但是&am…...

爬虫经典案例之爬取豆瓣电影Top250(方法二)

在上一篇文章的基础上,改进了代码质量,增加了多个正则表达式匹配,但同事也增加了程序执行的耗时。 from bs4 import BeautifulSoup import requests import time import re from random import randint import pandas as pdurl_list [https…...

如何优化React应用的性能?

优化React应用的性能是一个多方面的过程,涉及到代码的编写、组件的设计、资源的管理等多个层面。以下是一些常见的性能优化策略: 避免不必要的渲染: 使用React.memo、useMemo和useCallback来避免组件或其子组件不必要的重新渲染。 代码分割: 使用React.…...

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…...

python数据分析与可视化

Python 在数据分析和可视化方面有着广泛的应用,并且拥有众多强大的库和工具来支持这些任务。以下是一些常用的 Python 库和它们的主要用途: 数据分析 Pandas: Pandas 是 Python 中用于数据处理和分析的主要库。 它提供了数据框(DataFrame)和序列(Series)两种数据结构…...

webkit 的介绍

WebKit 是一个开源的网页浏览器引擎&#xff0c;它是 Safari 浏览器和许多其他应用程序的基础。WebKit 最初由苹果公司开发&#xff0c;并在2005年作为开源项目发布。WebKit 的核心组件包括 WebCore 和 JavaScriptCore。以下是 WebKit 的详细介绍&#xff1a; ### WebKit 的主…...

make与makefile

目录 一、make的默认目标文件与自动推导 二、不能连续make的原因 执行原理 touch .PHONY伪目标 make指令不回显 makefile多文件管理 简写依赖方法 三、回车与换行 四、缓冲区 一、make的默认目标文件与自动推导 假设这是一个makefile文件&#xff0c;make的时候默认生…...

深度神经网络一

文章目录 深度神经网络 (DNN)1. 概述2. 基本概念3. 网络结构 深度神经网络的层次结构详细讲解1. 输入层&#xff08;Input Layer&#xff09;2. 隐藏层&#xff08;Hidden Layers&#xff09;3. 输出层&#xff08;Output Layer&#xff09;整体流程深度神经网络的优点深度神经…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...