Linux之shell脚本篇(二)

一、shell编程之if语句

  • 引言

Linux在shell编程中,通常都是以自上而下运行,但是为了提高其代码严谨性,我们即引入了多条件 控制语句例如:if、for、while、case等语句,有时候针对条件我们还会结合正则表达式去运用。将这些流程控制语句进行熟练掌握,必然对shell脚本编写有很大的帮助

  • if表达式结构(三种)

结构形式语法
单表达式

if 表达式;then

        语句1

fi

双表达式

if 表达式;then

        语句1

else:

        语句2

fi

多表达式

if 表达式;then 

        语句1

elif 表达式

        语句2

else

        语句3

fi

二、示例分析

大小比较分析单分支、对分支语法

### if单语句#####引用单个数字比较
#!/bin/bash if (( 5 > 2 ));then echo "hello"###引用变量比较#!/bin/bash
$NUM1="$1"
$NUM2="$2"if (( $NUM1 > $NUMM2 ));then echo "=================="echo "$NUM1 greter than $NUM2"
fi## if多条件和双条件判断###引用变量比较#!/bin/bash
NUM1=$1
NUM2=$2if (( $NUM1 > $NUM2 ));then echo "=================="echo "$NUM1 greter than $NUM2"
else if [ $NUM1 == $NUM2 ];thenecho "$NUM1 is equal $NUM2"exitfiecho  "$NUM1 less than $NUM2"
fi

除了上述表达式可以用((表达式))之外,还可以使用test命令来表示表达式,除次之外还能判断文件是否存在(-f 参数   -d参数),我们通常会将test  =  [  ] 表示为等效的,【 】中不支持数学运算(>、<、=),但是可以用(gt、lt、eq)

上面的$?表示若执行结果为真那么返回结果为0,但如果非真,即结果不为0

我这里使用了test 的另一种等效写法做了修改(【   】)

#!/bin/bash
NUM1=$1
NUM2=$2if [ $NUM1 -gt $NUM2 ];then echo "=================="echo "$NUM1 greter than $NUM2"
else if [ $NUM1 -eq $NUM2 ];thenecho "$NUM1 is equal $NUM2"exitfiecho  "$NUM1 less than $NUM2"
fi

虽然一个[ express] 和[ [ express ] ],中的表达式都能用-eq、-gt、lt,但是在逻辑关系表示时的情况确截然不同

[ [ express ] ]中只能填写&&(逻辑与) 和 ||(逻辑或)

[ express] 只能填写-a(逻辑与),-o(逻辑或)

创建不存在的目录

#!/bin/bash
if [ ! -d /tmp/hello ];thenmkdir -p /tmp/helloecho "ok!!!!"
fi

if 多个条件测试判断成绩

#!/bin/bash
NUM=$1
if [ $NUM -ge 100 ];thenecho "vary good."elseif [ $NUM -ge 85 ];thenecho "good."elseif [ $NUM -ge 60 ];thenecho "pass."elseecho  "no pass."fifi
fiNUM=$1
if [ $NUM -ge 100 ];thenecho "vary good."
elif [ $NUM -ge 85 ];thenecho "good."
elif [ $NUM -ge 60 ];thenecho "pass."
elseecho  "no pass."

Nginx之v3脚本优化引用(位置参数)

严格规范参数表达

vim可视化块快捷使用技巧

(ctrl +v --------- 上下键选择----------大写I----------------修改----------- 2 Esc)

## 对help参数和位置参数的限制if [ $1 == "help" -o $1 == "-h"];then echo -e "\033[32m-----------------\033[0m"echo -e "\033[32mUsage:{/bin/sh $0 1.24.0|1.26.1|help}\033[0m"exit
fi## 避免重复性安装软件包
CHECK_NUM=$(rpm -qa | grep -wE "gcc|pcre-devel|zlib-devel|wget"|wc -l)
if [ $CHECK_NUM -lt 4 ];thenyum -y install wget tar make gccyum -y install pcre-devel zlib-devel openssl-devel
fi## 避免重复性编译,对于文件不存在编译安装if [ ! -f $NGX_DIR/sbin/nginx ];then
CHECK_NUM=$(rpm -qa | grep -wE "gcc|pcre-devel|zlib-devel|wget"|wc -l)
if [ $CHECK_NUM -lt 4 ];thenyum -y install wget tar make gccyum -y install pcre-devel zlib-devel openssl-devel
fi## 若软件已部署,提示已经部署了(若存在软件文件夹)
else  echo -e "\033--软件已经部署完成!!!!!无需重复部署,请输入是否重装?yes/no--\033[0m"ls -ld $NGX_DIRll $NGX_DIRread INPUT if [ $INPUT == "yes" -o $INPUT == "Y" ];then重装逻辑## 由于防火墙报错问题,需要先关闭nginx,然后对防火墙对外端口进行判断CHECK_FIRE=$(firewalld-cmd --list-all | grep -w "80" | wc -l)if [ $CHECK_FIRE -ne 1 ];thenfirewalld-cmd -add-port=80/tcp --permanentsystemctl reload firewalld.service
fi

如果想要对预编译、编译结果进行隐藏,可以使用黑洞文件 >> /dev/null 2>&1(这里2表示标准输出。1表示错误输出)

三、条件判断符号的使用

单引号和双引号本质区别在于内置变量引用必须使用双引号,单引号默认是字符串格式

$( command )    和`command`执行脚本命令结果是一样的

Nginx:v4版本更新之虚拟主机(多网站)的添加

虚拟主机完成构建

echo -e "\033[32m----正在配置虚拟主机--$NGX_VHOST-----\033[0m"
## 切换到Nginx目录
cd $NGX_DIR/conf## 备份Nginx配置文件
\cp  nginx.conf nginx.conf.bak
echo "
worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include domains/*;
}
">nginx.conf## 创建虚拟主机配置文件目录mkdir -p domains/## cd切换到domains目录
cd domains/echo "
server{listen 80;server_name v1.nginx;location / {root /data/webapp/v1.nginx;index index.html index.htm index.php;}
}">v1.nginx.conf## 创建虚拟主机发布目录,写入测试页面######## 多虚拟主机创建 添加位置参数$1($NGX_VHOST)   
mkdir -p /data/webapp/v1.nginx
echo "v1.nginx test pages." > /data/webapp/v1.nginx/index.html## 判断是否重启
$NGX_DIR/sbin/nginx -t > /dev/null 2>&1if [ $? -eq 0 ];then
## 重启nginx服务$NGX_DIR/sbin/nginx -s reload
fi
cat $NGX_VHOST
echo -e "\033[32m------------------\033[0m"
echo -e "\033[32m----nginx虚拟主机--$NGX_VHOST-----添加成功\033[0m"

添加成功效果如下:

添加nginx_host虚拟主机脚本位置优化之后脚本

#!/bin/bash# ***************************************************************************
# * 
# * @file:auto_install_nginx_v1.sh 
# * @author:www.hxd666.cn 
# * @date:2025-07-22 09:47 
# * @version 1.0  
# * @description: Shell script 
# * @Copyright (c)  all right reserved 
#* 
#**************************************************************************/ NGX_VER="$1"
NGX_URL="http://nginx.org/download"
NGX_SOFT="nginx-${NGX_VER}.tar.gz"
NGX_DIR="/usr/local/nginx"
NGX_ARGS="--user=www --group=www --with-http_stub_status_module"
NGX_SRC=$(echo $NGX_SOFT | sed 's/.tar.gz//g')
NGX_VHOST=$1
## 创建虚拟主机echo -e "033[32m---------正在配置虚拟主机------033[32m"cd $NGX_DIR/conf\cp nginx.conf nginx.conf.bak## 创建nginx配置文件
echo "
worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include domains/*;
}" > nginx.conf## 创建 虚拟主机配置文件
mkdir -p domains/cd domainsecho "server{listen 80;server_name $NGX_VHOST;location / {root /data/webapp/$NGX_VHOST;index index.html index.htm index.php;}
}
" > $NGX_VHOST.conf## 创建虚拟主机目录mkdir -p /data/webapp/$NGX_VHOST
echo "$NGX_VHOST test pages." > /data/webapp/"$NGX_VHOST"/index.html## 判断是否重启if [ $? -eq 0 ];then $NGX_DIR/sbin/nginx -s reload
ficat $NGX_VHOST.confecho "033[32m----------nginx 虚拟主机--$NGX_VHOST-----添加成功!!!!"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93305.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在android framewrok dump camera data

实现dump 函数 实现1 void dumpBufferToFile(buffer_handle_t* buffer, int width, int height, int frameNum) {void* data NULL;GraphicBufferMapper::getInstance().lock(*buffer, GRALLOC_USAGE_SW_READ_OFTEN, Rect(width, height), &data);char filename[128];sprin…

机器学习中的可解释性:深入理解SHAP值及其应用

机器学习可解释性的重要性在人工智能技术快速发展的2025年&#xff0c;机器学习模型已经深度渗透到医疗诊断、金融风控、司法量刑等关键领域。然而&#xff0c;随着模型复杂度的不断提升&#xff0c;一个根本性矛盾日益凸显&#xff1a;模型预测性能的提升往往以牺牲可解释性为…

.NET9 使用 OData 协议项目实战

.NET 中 ODate 协议介绍 OData(Open Data Protocol) 是一个开放的 Web 协议&#xff0c;用于查询和更新数据。在 .NET 生态系统中&#xff0c;OData 被广泛支持和使用。 主要特性 1. 统一的数据访问方式 提供标准化的查询语法支持 CRUD 操作支持元数据描述 2. 查询能力 标…

Android 性能优化:提升应用启动速度(GC抑制)

前言 在移动应用开发领域&#xff0c;启动速度是用户体验的重要指标。对于Android应用而言&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制虽然是内存管理的核心&#xff0c;但在应用启动期间频繁触发GC会显著拖慢启动速度。本文将深入探讨如何通过GC…

做了一款小而美的本地校验器

需求说明 前阵子收到一则读者留言&#xff0c;指出&#xff1a;市面上AI核稿工具&#xff08;ProWritingAid&#xff0c;WPS AI Spell Check&#xff0c;Writer&#xff0c;QuillBot&#xff0c;Grammarly&#xff09;要么收费太高&#xff0c;要么让人担心文章泄露。 如下图所…

uniapp + uview-plus 微信小程序二维码生成和保存完整解决方案

uniapp + uview-plus 微信小程序二维码生成和保存完整解决方案 📋 项目背景 在开发微信小程序时,经常需要实现二维码的生成和保存功能。本文档提供了一个基于 uniapp + uview-plus 框架的完整解决方案,彻底解决了以下常见问题: ✅ Canvas API 兼容性问题 ✅ 微信小程序权…

Linux中应用程序的安装于管理

Linux中应用程序的安装于管理 一 . rpm安装 1.挂载 光驱里面存放了很多rpm的软件包 光驱在系统中使用时&#xff0c;需要挂载 mount /dev/cdrom /mnt/ cd /mnt[rootstw mnt]# ls CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7 EFI images Packag…

mysql重置密码

要区分 MySQL 是通过 systemd 还是传统 service 管理&#xff0c;以及对应的密码重置方案&#xff0c;可按以下步骤操作&#xff1a; 一、如何区分管理方式&#xff08;systemd 还是传统 service&#xff09; 通过以下命令判断系统默认的服务管理方式&#xff1a;检查系统是否使…

C++ TAP(基于任务的异步编程模式)

&#x1f680; C TAP&#xff08;基于任务的异步编程模式&#xff09;1. 引言&#xff1a;走进异步编程新时代&#xff08;&#x1f680;&#xff09; 在当今高性能计算领域&#xff0c;同步编程模型的局限性日益凸显。传统的回调地狱和线程管理复杂性促使微软提出了基于任务的…

利用C++手撕栈与队列的基本功能(四)

栈和队列详细教程可以观看 https://www.bilibili.com/video/BV1nJ411V7bd?spm_id_from333.788.videopod.episodes&vd_sourcedaed5b8a51d3ab7eb209efa9d0ff9a34&p48栈和队列概念 栈和队列是限定插入和删除只能在表的端点进行的线性表在装电池、装弹夹、拿放盘子时都会出…

net8.0一键创建支持(Redis)

Necore项目生成器 - 在线创建Necore模板项目 | 一键下载 RedisController.cs using CSRedis; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using UnT.Template.Application.Responses; using UnT.Template.Domain;namespace UnT.Template.Controllers {…

Leetcode——42. 接雨水

还记得第一次见该题根本无从下手。其实&#xff0c;我们不妨把问题拆解&#xff0c;简单化。不要怕自己写的是暴力算法&#xff0c;有很多算法技巧其实就是在暴力算法的基础上优化得来。题目目的是求所有可接雨水数量&#xff0c;我们可以求出每一个位置可接雨水数量&#xff0…

Go 语言-->指针

Go 语言–>指针 它允许你操作内存中的实际数据&#xff0c;而不仅仅是数据的副本。指针存储的是另一个变量的内存地址&#xff0c;而不是变量的实际值。 1. 什么是指针 指针是存储变量内存地址的变量&#xff0c;它指向另一个变量。通过指针&#xff0c;你可以间接地访问和修…

软工八将:软件开发全流程核心角色体系解析

软工八将&#xff1a;软件开发全流程核心角色体系解析 作者注&#xff1a;本概念是由大学生董翔提出&#xff0c;具有一些影响意义。 在现代软件开发领域&#xff0c;团队角色的专业化分工是产品成功的核心保障。“软工八将”作为一套系统梳理软件开发全流程核心角色的术语&…

安全风险监测系统是什么?内容有哪些?

安全风险监测系统是基于物联网感知网络与智能分析技术的综合管理平台&#xff0c;通过实时采集、分析和评估各类安全风险指标&#xff0c;构建起覆盖识别、预警、处置全流程的主动防御体系。作为现代安全管理的中枢神经系统&#xff0c;该系统实现了从被动响应到主动预防的范式…

车载诊断架构 ---面向售后的DTC应该怎么样填写?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

墨者:SQL注入漏洞测试(宽字节)

墨者学院&#xff1a;SQL注入漏洞测试(宽字节)&#x1f680; 1. 宽字节注入原理✨ 1.1. 与普通注入对比⭐ 特性普通注入宽字节注入适用场景无转义处理使用addslashes()等转义函数核心原理直接闭合引号利用GBK等编码吞掉转义符\关键字符 " -- #%df %5c防御难度易防御需调…

(二)Eshop(RabbitMQ手动)

文章目录项目地址一、Rabbit MQ1.1 Pulibsher1. IRabbitMQPublisher接口2. RabbitMQPublisher接口实现3. 使用1.2 Consumer1. 消费接口2. 实现消费者接口项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt a…

WPF高级学习(一)

文章目录一、理解进程和线程1. 进程&#xff1a;就像一个独立的“工厂”举例&#xff1a;2. 线程&#xff1a;就像工厂里的“工人”举例&#xff1a;总结&#xff1a;进程 vs 线程二、线程一、WPF 中的线程类型二、核心规则&#xff1a;线程亲和性&#xff08;Thread Affinity&…

JAVA知识点(四):SpringBoot与分布式、微服务架构

文章目录SpringBoot 使用 Validation 进行参数校验并统一返回校验异常引入相应的依赖Validation的基本校验注解添加参数校验在DTO的属性上添加校验在controller对应的DTO添加Valid或者Validated对于复杂String校验我们可以使用正则来校验&#xff0c;如下所示&#xff1a;自定义…