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

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数据库…...

蓝桥杯刷题记录之数字王国之军训排队

记录 卡了半天&#xff0c;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?

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、走近Go①Go语言的Logo②Go语言的创始人③Go语…...

C语言内存函数之 memcmp函数

memcmp函数的记忆&#xff1a;mem表示内存&#xff0c;单位是字节&#xff0c;表示以单位字节来进行操作&#xff1b;头文件是string.h&#xff0c;cmp是compare的缩写&#xff0c;表示比较。总的意思就是在规定的内存下以字节为单位一个字节一个字节的进行比较。 memcmp函数的…...

3. C++ 常见的段错误及对策

常见的 C/C 段错误及对策 一、指针没有指向一块合法的内存 定义了指针变量&#xff0c;但是没有为指针分配内存&#xff0c;即指针没有指向一块合法的内存。这里举几个比较隐蔽的例子。 结构体成员指针未初始化&#xff1b;没有为结构体指针分配足够的内存&#xff1b;函数的…...

推荐的Kubernetes 学习资料

官方文档&#xff1a; Kubernetes 官方文档&#xff1a;https://kubernetes.io/docs/Kubernetes 教程&#xff1a;https://kubernetes.io/docs/tutorials/ 书籍&#xff1a; Kubernetes in Action&#xff0c;Marko Luksa 著Kubernetes Up and Running&#xff0c;Kelsey Hi…...

MySQL之索引与事务

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

Linux的基本使用

1.Linux的背景 1.1什么Linux Linux是⼀个操作系统.和Windows是"并列"的关系. 1.2Linux系统的优势 1. 开源(意味着免费,便宜) 2. 稳定(Linux可以运⾏很多年,都不会发⽣重⼤问题) 3. 安全(Linux只有管理员或者特定⽤⼾才能访问Linux内核) 4. ⾃由(不会被强加商业产品和…...

亚信安慧AntDB全景观察:数据库领域的创新者

随着大数据时代的到来&#xff0c;对数据库的需求愈发强烈。在这一背景下&#xff0c;国产数据库逐渐崭露头角&#xff0c;亚信安慧AntDB作为重要的代表产品之一正积极参与到激烈的市场竞争中。亚信安慧AntDB不仅追求技术的革新和突破&#xff0c;同时也致力于满足用户日益增长…...

Linux 系统是如何收发⽹络包的

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

飞跃前端瓶颈:技术进阶指南精华篇

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

Jenkins安装 Linux 更换镜像 安装插件

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

(一)基于IDEA的JAVA基础1

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

FPGA开源项目分享——基于FPGA加速的热扩散模拟器

导语 今天继续分享康奈尔大学FPGA课程ECE 5760的典型案例——基于FPGA加速的热扩散模拟器。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 https://people.ece.cornell.edu/land/courses/ece5760/FinalProje…...

【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】

文章目录 寄存器位清0和置位函数实现示例使用方式注意事项 寄存器位清0和置位函数实现 在 C 语言中&#xff0c;可以使用宏定义来创建用于清除&#xff08;清零&#xff09;或设置&#xff08;置一&#xff09;32位地址中特定位的函数。以下是两个宏定义的示例&#xff1a; #…...

Java实现10万,并发去重,优雅地处理重复请求!

对于一些用户请求&#xff0c;在某些情况下是可能重复发送的&#xff0c;如果是查询类操作并无大碍&#xff0c;但其中有些是涉及写入操作的&#xff0c;一旦重复了&#xff0c;可能会导致很严重的后果&#xff0c;例如交易的接口如果重复请求可能会重复下单。 重复的场景有可…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...