linux sh脚本编写
linux中bash
Shell 是 Linux 的核心部分,它允许你使用各种诸如 cd、ls、cat 等的命令与 Linux 内核进行交互。Bash脚本和Shell脚本实际上是指同一种类型的脚本,只不过Bash是其中最常用的一种Shell。除了Bash之外,常见的Shell解释器还有C Shell (csh)、Korn Shell (ksh)、Z Shell (zsh)等。
Bash是一种Unix shell,Bash是Bourne Again SHell的缩写。用于与操作系统进行交互,执行命令和脚本,以及管理文件和目录。用于自动化任务、批处理操作、系统管理、软件开发等各种用途。
命名:后缀名为.sh代表是一个shell脚本文件
#!/bin/bash
这一行被称为shebang 行,在某些文献中,它被称为hashbang 行,这是因为它以两个字符hash ‘#’ 和bang ‘!’ 开头。
#!/bin/sh (必须放在文件的第一行)
符号#!用来告诉系统它后面的参数是用来执行该文件的程序
注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。
启动脚本
一种是将文件名作为shell命令的参数。
调用格式为: bash 脚本名称.sh
特点: 文件无需可执行权限
当要被执行的脚本文件没有可执行权限时,只能使用这种调用方式。
当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。
第二种办法: ./+文件名执行
注意:需要注意文件以及用户是否拥有可执行权限。
当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。和第一种办法等效。
延伸:
source
使用source script.sh方式,在当前上下文中执行脚本,不会生成新的进程,执行完毕,回到当前shell。source方式也叫点命令,. script.sh与source script.sh等效。注意在点命令中,.与script.sh之间有一个空格。
exec
使用exec command方式,会用command进程替换当前shell进程,并且保持PID不变。执行完毕,直接退出,不回到之前的shell环境。
变量
在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:变量名=值
取出变量值可以加一个美元符号($)在变量前面
定义变量有以下几点需要注意
(1)变量名可以包含_、数字、大小写字母,但不能以数字开头
(2)“=”两边不要有空格
(3)“值”如果含有空格,要使用单引号''或双引号""引起来
(4)定义变量时,变量名前是不需要加$的,引用变量时需要在变量名前加$
通过read命令来获取变量
read ‐p "提示信息" 变量
当遇到read命令时,系统会等待用户输入,用户所输入的值会赋值给read后面的变量。
[root@redhat8 yy]# read -p "请输入你的名字:" aa
请输入你的名字:jin
[root@redhat8 yy]# echo $aa
jin
[root@redhat8 yy]#
环境变量
在定义环境变量时,前面加上export 即可。
常用的环境变量
PATH
PATH环境变量定义了系统在哪些目录中查找可执行文件
HOSTNAME
服务器的主机名。
SHELL
用户当前使用的Shell解析器。
HISTSIZE
保存历史命令的数目。
USER
当前登录用户的用户名。
HOME
当前登录用户的主目录。
PWD
当前工作目录。
LD_LIBRARY_PATH
C/c++动态链接库文件搜索的目录
CLASSPATH
JAVA语言库文件搜索的目录
向 Bash 脚本传递参数
在运行 Bash 脚本时以以下方式传递参数.
./my_script.sh arg1 arg2
参数详解
$0 对应的是当前 Shell 脚本程序的名称
$# 对应的是总共有几个参数(参数个数)
$* 对应的是所有位置的参数值
$? 对应的是显示上一次命令的执行返回值
$N对应的是第 N 个位置的参数值
通配符
通配符一般用在shell语言中,通配符中常见的元字符如下:
(1)[]:匹配一个字符,匹配的是出现在中括号中的字符
(2)[abc]:匹配一个字符,且只能是a或b或c
(3)[a-z]:“-”有特殊意义,表示“到”的意思,这里表示a~z,即匹配任一字母
(4)[0-9]:表示匹配任一数字
如果想去除含有特殊意义的字符,前面加“\”表示转义,即去除此字符的特殊意义
(5)[a\-z]:这里的“-”就没有“到”的意思了,匹配的是“a”或“-”或“z”这三个中的一个
如果想表示“除了”的意思,则在第一个中括号后面加“!”或“^”
(6)[!a-z]、[^a-z]:表示除字母外的其他字符
(7)?:表示一个任意字符,这里强调是一个,不是0个也不是多个,但不能匹配表示隐藏文件的点
(8)*:表示任意多个任意字符,可以是0个,也可以是1个或多个,但不能匹配表示隐藏文件的点
基础字符串操作
获取字符串长度
${#string}
var="hello world"
echo ${var}
echo ${#var}
连接两个字符串
str3=$str1$str2
常用命令语法及功能
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
find: 搜索文件比如:根据文件名搜索find . -name filename -print
流程控制
“if” 表达式 如果条件为真则执行then后面的部分
if ....; then
....
elif ....; then
....
else
....
Fi
条件测试语句
Shell 脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。
条件测试语法的执行格式:
[ condition ]
注意:条件表达式两边均应有一个空格。
文件测试语句
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符。
运算符 | 作用 |
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
逻辑测试语句
逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果.
逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令.
逻辑“或”的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令。
运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。
整数值比较语句
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。
运算符 | 作用 | |
-eq equal | 是否等于 | |
-ne not equal | 是否不等于 | |
-gt greater than | 是否大于 | |
-lt lower than | 是否小于 | |
-le lower equal | 是否等于或小于 | |
-ge greater than | 是否大于或等于 |
字符串比较语句
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值)。
运算符 | 作用 |
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
流程控制语句
if 语句分为单分支结构、双分支结构、多分支结构。
单分支结构
单分支结构由 if、then、fi 关键词组成,而且只在条件成立后才执行预设的命令。
if condition
then ...
Fi
双分支结构
if 条件语句的双分支结构由 if、then、else、fi 关键词组成,它进行一次条件匹配判断, 如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令
如:
if condition
then ...
else ...
Fi
多分支结构
if 条件语句的多分支结构由if、then、else、elif、fi 关键词组成,它进行多次条件匹配判断,这多次判断中的任何一项在匹配成功后都会执行相应的预设命令。
if condition1
then ...
elif condition2
then ...
else ...
Fi
for 条件循环语句
for x in xx
do...
done
while 条件循环语句
while condition
do ...
done
将 shell 脚本添加到 PATH
前面使用 ./test.sh 来运行脚本;如果省略前导 ./; ./ 代表当前目录
Bash 认为你正在尝试运行名为 scripts.sh 的命令。当你在终端上运行任何命令时,shell 就在存储在 PATH 变量中的一组目录中查找该命令.
所以需要export PATH=$PATH:/包含test.sh的目录
使用函数
function_name() {
commands
}
使用带参数的函数的 Bash 脚本样例
#!/bin/bash
sum() {
sum=$(($1+$2))
echo "The sum of $1 and $2 is: $sum"
}
echo "Let's use the sum function"
sum 1 5
相关文章:

linux sh脚本编写
linux中bash Shell 是 Linux 的核心部分,它允许你使用各种诸如 cd、ls、cat 等的命令与 Linux 内核进行交互。Bash脚本和Shell脚本实际上是指同一种类型的脚本,只不过Bash是其中最常用的一种Shell。除了Bash之外,常见的Shell解释器还有C She…...
代码随想录笔记|C++数据结构与算法学习笔记-字符串(二)|28. 实现 strStr()、459.重复的子字符串、KMP算法
文章目录 卡码网.右旋字符串28. 实现 strStr()KMP算法(理论)KMP算法(代码)C代码 459.重复的子字符串暴力解法移动匹配KMP解法 卡码网.右旋字符串 卡码网题目链接 略 28. 实现 strStr() 力扣题目链接 文字链接:28. 实现 strStr() 视频链接:帮你把KMP算法…...

【复杂网络建模】——建模工具Matlab入门
目录 一、认识MATLAB 二、认识工具箱 三、基本操作和函数 3.1 算术操作符 3.2 数学函数 3.3 矩阵操作 3.4 索引和切片 3.5 逻辑操作 3.6 控制流程 3.7 数据输入输出 四、变量和数据类型 4.1 数值类型 4.2 整型 4.3 复数 4.4 字符串 4.5 逻辑类型 4.6 结构体&a…...

JVM面试篇
面试篇就是复习前面学的 什么是JVM 1.定义:JVM指的是Java虚拟机,本质是一个运行在计算机上的程序 2.作用:为了支持Java中Write Once ,Run Anywhere 编写一次 到处运行的跨平台特性 功能: 1.解释和运行 2.内存管理…...

openEuler 22.03(华为欧拉)一键安装 Oracle 19C RAC(19.22) 数据库
前言 Oracle 一键安装脚本,演示 openEuler 22.03 一键安装 Oracle 19C RAC 过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载地址:Shell脚本安装Oracle数据库…...
蓝桥杯刷题记录之数字王国之军训排队
记录 卡了半天,check函数中的temp % ele 0写成了ele % temp 0就挺无语的 思路 这个晚上在补 代码 import java.util.*; public class Main{static List<List<Integer>> que new ArrayList<>();static int MIN Integer.MAX_VALUE;static i…...

Go语言学习Day1:什么是Go?
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、走近Go①Go语言的Logo②Go语言的创始人③Go语…...

C语言内存函数之 memcmp函数
memcmp函数的记忆:mem表示内存,单位是字节,表示以单位字节来进行操作;头文件是string.h,cmp是compare的缩写,表示比较。总的意思就是在规定的内存下以字节为单位一个字节一个字节的进行比较。 memcmp函数的…...
3. C++ 常见的段错误及对策
常见的 C/C 段错误及对策 一、指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存。这里举几个比较隐蔽的例子。 结构体成员指针未初始化;没有为结构体指针分配足够的内存;函数的…...
推荐的Kubernetes 学习资料
官方文档: Kubernetes 官方文档:https://kubernetes.io/docs/Kubernetes 教程:https://kubernetes.io/docs/tutorials/ 书籍: Kubernetes in Action,Marko Luksa 著Kubernetes Up and Running,Kelsey Hi…...

MySQL之索引与事务
一 索引的概念 一种帮助系统查找信息的数据 数据库索引 是一个排序的列表,存储着索引值和这个值所对应的物理地址无须对整个表进行扫描,通过物理地 址就可以找到所需数据是表中一列或者若干列值排序的方法 需要额外的磁盘空间 索引的作用 1 数据库…...

Linux的基本使用
1.Linux的背景 1.1什么Linux Linux是⼀个操作系统.和Windows是"并列"的关系. 1.2Linux系统的优势 1. 开源(意味着免费,便宜) 2. 稳定(Linux可以运⾏很多年,都不会发⽣重⼤问题) 3. 安全(Linux只有管理员或者特定⽤⼾才能访问Linux内核) 4. ⾃由(不会被强加商业产品和…...
亚信安慧AntDB全景观察:数据库领域的创新者
随着大数据时代的到来,对数据库的需求愈发强烈。在这一背景下,国产数据库逐渐崭露头角,亚信安慧AntDB作为重要的代表产品之一正积极参与到激烈的市场竞争中。亚信安慧AntDB不仅追求技术的革新和突破,同时也致力于满足用户日益增长…...

Linux 系统是如何收发⽹络包的
Linux 系统是如何收发⽹络包的? ⽹络模型 为了使得多种设备能通过⽹络相互通信,和为了解决各种不同设备在⽹络互联中的兼容性问题,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference Mode…...

飞跃前端瓶颈:技术进阶指南精华篇
引言: 在互联网的快车道上,前端技术日新月异。对于前端工程师而言,技术水平达到一定高度后,往往会遭遇成长的天花板。本文将探讨如何识别并突破这些技术瓶颈,分享实用的进阶策略和实践案例。 一、技术等级概览…...

Jenkins安装 Linux 更换镜像 安装插件
Jenkins安装 Linux 更换镜像 安装插件 前言 下面叙述了三种jenkins安装的方式,jenkins安装之前必须有java环境因为他是java写的… yum安装只能安装最新版本的jenkins,但是jenkins是java写的所以他强依赖java版本,当你的服务器的java版本与jenkins版本冲突时还需要给jenkins重…...

(一)基于IDEA的JAVA基础1
Java是一门面向对象的编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论࿰…...

FPGA开源项目分享——基于FPGA加速的热扩散模拟器
导语 今天继续分享康奈尔大学FPGA课程ECE 5760的典型案例——基于FPGA加速的热扩散模拟器。 (更多其他案例请参考网站: Final Projects ECE 5760) 1. 项目概述 项目网址 https://people.ece.cornell.edu/land/courses/ece5760/FinalProje…...
【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】
文章目录 寄存器位清0和置位函数实现示例使用方式注意事项 寄存器位清0和置位函数实现 在 C 语言中,可以使用宏定义来创建用于清除(清零)或设置(置一)32位地址中特定位的函数。以下是两个宏定义的示例: #…...
Java实现10万,并发去重,优雅地处理重复请求!
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。 重复的场景有可…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...