Linux系列--shell编程一

一、Linux系统结构

一、内核层

内核是Linux系统的核心部分,它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务。Linux内核设计了良好的模块化结构,可以动态地加载和卸载内核模块,这使得内核可以兼容各种不同的硬件设备和外围设备。

二、Shell层

Shell是Linux系统的命令行解释器,它负责将用户输入的命令解释并执行。Linux系统上有多种Shell,其中最常用的是Bash Shell。Bash Shell 提供了各种丰富的功能和处理能力,如通配符、重定向、管道、变量等等。

 三、应用层

应用层是Linux系统上的各种应用程序和服务,包括文本编辑器、图形界面、Web服务器、邮件服务器、数据库服务器等。在Linux系统中,应用程序通常以开放源代码方式呈现,用户可以自由学习和使用,也可以根据需求自己编写、修改或扩展。

二、shell基础语法

一、shell介绍

Shell是一种用于与操作系统进行交互的命令行解释器。它是一种脚本语言,可以通过编写一系列的命令和脚本来执行操作系统的功能和任务。

二、shell的种类

  1. Bourne Shell(/bin/sh):是Unix系统最早的shell程序,由史蒂夫·伯恩斯(Steve Bourne)编写。该shell程序是许多Linux发行版中默认使用的程序。
  2. Bourne-Again SHell(/bin/bash):是GNU项目的一部分,是Bourne Shell的增强版,目前在大部分Linux发行版中是默认的shell程序。
  3. C Shell (/bin/csh):是Bill Joy编写的一个具有面向对象设计理念的shell程序,它采用与C语言相似的语法和控制结构。C Shell中的命令提示符为%号。
  4. TENEX C Shell(/bin/tcsh):是C Shell的增强版,它对历史命令和别名等方面进行了改进,同时也支持C Shell中的所有特性。TENEX C Shell中的命令提示符也为%号。
  5. Korn Shell(/bin/ksh):是由David Korn编写的shell程序,它是Bourne Shell和C Shell的结合,拥有两种不同的工作模式:交互模式和批处理模式。
  6. Z Shell(/bin/zsh):是一个功能强大的shell程序,它是Bourne Shell的增强版,具有缩写、自动完成、句法高亮等功能,同时也支持Korn Shell、C Shell以及Bourne Shell的语法和命令。

 三、基础语法

shell脚本可以编写在一个xxx.sh结尾的文件中,xxx.sh文件我们称为shell脚本文件。
shell脚本文件是一个可执行文件,类似于windows环境中的xxx.exe 或 xxx.bat 等文件。

一、切换shell

在CentOS中,可以使用chsh命令切换默认Shell。chsh命令允许您更改用户的登录Shell。以下是切换Shell的步骤:

1、查看已安装的Shell。

cat /etc/shells

2、更改Shell。

chsh -s /bin/sh

3、重新登录后:检查Shell是否已更改

echo $SHELL

二、注释 

一、单行注释

单行注释是一行文本,它以井号(#)开头,从该字符开始一直延伸到该行的结束。在此行内,任何内容都会被 Shell 解释器忽略:

# 这是一行注释
echo "Hello, World!"  # 这是一行带有注释的代码

二、多行注释

Shell 脚本也支持多行注释,这种注释也被称为块注释。块注释在脚本中可以用于分组一系列代码,或将一段代码置于未被执行的状态。在 Bash Shell 中,块注释通常使用以下语法:和'之间有一个空格,这个不能忽略,否者会出错。

: '
这里是注释内容。
可以是多行,直到下面一行的单独引号为止。
'

三、变量 

一、shell变量有三种:

  1. 环境变量
  2. 本地变量
  3. 特殊变量

二、环境变量

1、环境变量是在Shell会话外设置的,可以由多个脚本和进程共享。在Linux中,环境变量没有固定的值,而是在需要时通过脚本或命令进行设置或更新。(系统环境变量一般在/etc/profile文件中设置。

2、查看当前所有环境变量

printenv
或
env

3、设置一个新的环境变量

export MY_VAR="Hello World"

4、要使用环境变量,在变量名称前必须加上$符号

echo $MY_VAR

三、本地变量

一、shell脚本变量命名规范

  1. 变量名由字母、数字和下划线组成。
  2. 不能以数字开头。
  3. 区分大小写。
  4. 等号两侧不能有空格。
  5. 不能使用特殊字符作为变量名,如$, &, !, (, ), *等。
  6. 环境变量一般是全部大写,单词和单词之间采用下划线分割:JAVA_HOME, CATALINA_HOME
  7. 本地变量一般是小写

二、本地变量是一种临时变量,在Shell会话中设置和使用。与环境变量不同,本地变量仅限于当前Shell会话,不会被其他脚本或命令使用。设置本地变量可以使用“=”号操作符。

my_var="Hello World"echo $my_var

四、特殊变量

一、特殊变量是在Shell中预定义的变量名称,具有特殊的含义。这些变量与当前Shell会话有关,可以用于许多不同的用途,包括文件和目录操作、命令历史记录和处理脚本参数等等。

二、常见的一些特殊变量

  • $0: 当前脚本的文件名
  • $1, $2...: 脚本参数列表中的第1个、第2个参数等等 (例如:./first.sh abc def,在执行这个脚本时,第一个参数abc,第二个参数def。)
  • $#: 脚本参数的数量
  • $*: 所有脚本参数的列表(将所有的参数作为一个字符串:"zhangsan lisi wangwu")
  • $@: 所有脚本参数的列表(将每一个参数作为一个独立的字符串:"zhangsan" "lisi" "wangwu")
  • $$: 当前脚本的进程ID号
  • $?: 上一个命令的退出状态,一个数值。

三、$? 这个特殊变量的用法

ls -l /etc/passwd
if [ $? -eq 0 ]; thenecho "ls command succeeded"
elseecho "ls command failed"
fi

这个变量可以用来获取上一条命令的执行结果是否正确,如果执行结果是0表示成功,其他值表示失败

四、控制语句 

一、shell中的中括号用法

一、用于比较操作符:用于比较两个值的大小或者判断两个值是否相等

  • -eq: 判断两个值是否相等(equal to),例如[ $a -eq $b ]
  • -ne: 判断两个值是否不相等(not equal to),例如[ $a -ne $b ]
  • -lt: 判断左边的值是否小于右边的值(less than),例如[ $a -lt $b ]
  • -gt: 判断左边的值是否大于右边的值(greater than),例如[ $a -gt $b ]
  • -le: 判断左边的值是否小于等于右边的值(less than or equal to),例如[ $a -le $b ]
  • -ge: 判断左边的值是否大于等于右边的值(greater than or equal to),例如[ $a -ge $b ]

在Shell中,比较操作符可以用于中括号[]中,例如:[ $a -eq $b ]。在比较时,要注意两个值之间必须有空格分隔,否则会出现语法错误。

二、用于测试表达式:用于测试某个表达式是否成立

  • -f: 判断某个文件是否存在并且是一个常规文件(regular file),例如[ -f file.txt ]
  • -d: 判断某个文件是否存在并且是一个目录(directory),例如[ -d dir ]
  • -z: 判断某个字符串是否为空(zero length),例如[ -z "$str" ]
  • -n: 判断某个字符串是否非空(not zero length),例如[ -n "$str" ]
  • -e: 判断某个文件或目录是否存在(exist),例如[ -e file.txt ]

在Shell中,测试表达式也可以用于中括号[]中,例如:[ -f file.txt ]。在多数Linux发行版中,测试表达式可以用中括号[]或者test命令实现,例如:test -f file.txt等价于[ -f file.txt ]。需要注意的是,中括号中的空格很重要,空格缺少会导致语法错误。另外,在使用中括号[]时,要注意变量用双引号括起来,避免空值引起的语法错误。

二、if语句详解

if condition 
thencommand1command2...
elif condition2 
thencommand3command4...
elsecommand5command6...
fi栗子:#!/bin/bashif [ -f file.txt ] 
thenecho "file.txt exists."
elif [ -d dir ] 
thenecho "dir exists."
elseecho "file.txt and dir not found."
fi

其中,condition是要检查的条件,可以是命令、变量、表达式等任何Shell语法,then表示条件成立要执行的语句块,如果有多个条件,可以使用elif语句来添加多个条件,每个条件使用then分别表示要执行的语句块,如果所有条件都不成立,则执行else分支中的语句块。
if语句的执行过程是从上到下依次判断每个条件,如果条件成立,则执行对应的语句块,执行完后跳出if语句。

栗子:

#!/bin/bashif [ -f file.txt ] 
thenecho "file.txt exists."
elif [ -d dir ] 
thenecho "dir exists."
elseecho "file.txt and dir not found."
fi

三、for循环详解

1、语法

for var in list
docommand1command2...
done

其中,var是一个临时的变量名,用于存储当前循环的值,list是一个值或者多个带有空格或换行符分隔的值组成的列表。在每一次循环迭代时,var会被list列表中的一个值所替换,直到list中的所有值都被处理完为止。

#!/bin/bashfor i in 1 2 3 4 5
doecho "The value of i is: $i"
done

四、while循环详解

1、语法:

while condition
docommand1command2...
done

其中,condition是要检查的条件,如果条件为真,则执行do语句块中的命令,执行完后再回到while语句中检查条件是否依然为真,如果条件仍为真,则继续执行命令块,否则跳出循环。

注意:在shell编程中 ((...)) 被称为算术扩展运算符,做数学运算的,并且将运算结果返回。(...)运算符会将结果直接返回。

  • $((j+1)),如果j是5的话,结果就会返回6 (注意,使用这个运算符的时候,括号里面不能有空格)
  • $(echo "hello world"),会将"hello world"打印,然后再将"hello world"字符串返回。

栗子:

#!/bin/bashj=0
while [ $j -lt 5 ]
doecho "The value of j is: $j"j=$((j+1))
done

五、until循环详解

1、语法:

until condition
docommand1command2...
done

其中,condition是要检查的条件,如果条件为假,则执行do语句块中的命令,执行完后再回到until语句中检查条件是否依然为假,如果条件仍为假,则继续执行命令块,否则跳出循环。

#!/bin/bashk=0
until [ $k -ge 5 ]
doecho "The value of k is: $k"k=$((k+1))
done

六、break和continue语句

1、break语句用于跳出当前循环块,例如在for循环和while循环中使用该语句时,可以跳出当前循环并停止迭代。break语句可以嵌套在多重循环中,用于跳出内层循环和外层循环

while condition
docommand1command2if condition2 thenbreakficommand3...
done

在上述示例中,如果在执行command2时,条件condition2成立,那么会执行break语句,跳出循环块并停止迭代。

2、continue语句用于跳过本次循环迭代,直接进入下一次的迭代。在for循环和while循环中使用该语句时,可以用于跳过本次迭代,执行下一次迭代。其语法格式如下

while condition
docommand1command2if condition2thencontinueficommand3...
done

如果在执行command2时,条件condition2成立,那么会执行continue语句,跳过本次迭代,直接进入下一次迭代。

栗子:

#!/bin/bashfor l in 1 2 3 4 5
doif [ $l -eq 3 ] thencontinuefiecho "The value of l is: $l"if [ $l -eq 4 ] thenbreakfi
done

五、函数

一、什么是函数

在Shell编程中,函数是一种可重用的代码块,其实就是相当于java的方法。

二、定义函数

1、语法

function_name() {commands
}

2、栗子

function say_hello() {echo "Hello, world!"
}

使用function关键字来定义函数是可选的。当使用function关键字时,要注意不要加空格,否则会出现语法错误。函数体中可以包含任意数量的命令和语句。

三、调用函数

成功定义一个函数后,可以在程序的任何地方调用它。只需要使用函数的名称,即可调用函数。例如:

say_hello

四、传递参数

Shell函数也支持传递参数。在调用函数时,可以把参数传递给函数,让函数使用这些参数来完成特定的任务

function greet() {echo "Hello, $1 $2"
}greet "John" "Doe"

上述示例中,我们定义了一个名为greet的函数,它输入参数1和2,并把这些参数用于输出字符串Hello, $1 $2。我们调用greet函数,并把参数"John"和"Doe"传递给它,最终输出Hello, John Doe字符串。

在函数中,参数可以使用1、2、3等占位符来引用。1表示第一个参数,$2表示第二个参数,以此类推。

栗子:

#!/bin/sh# 定义函数say_hello
say_hello() {echo "Hello, world!"
}# 调用函数say_hello
say_hello# 定义函数greet
greet() {echo "Hello, $1 $2"
}# 调用函数greet
greet "John" "Doe"

 

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

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

相关文章

基于联咏 NT98692芯片赋能边缘计算IP摄像机与XVR监控系统解决方案

联咏 NT98692 是一款新世代整合度极高的 SoC,具有高影像品质、低位元率、低功耗,针对 8Kp30 边缘运算 IP 摄影机与后端监控系统 XVR 应用。此 SoC 整合了 ARM Quad Cortex A73 CPU 核心、新一代 ISP 和 AI ISP、H.265/H.264 视讯压缩编解码器、DSP、高效…

C++ primer plus 第16章string 类和标准模板库, 函数符概念

C primer plus 第16章string 类和标准模板库, 函数符概念 C primer plus 第16章string 类和标准模板库, 函数符概念 文章目录 C primer plus 第16章string 类和标准模板库, 函数符概念16.5.1 函数符概念程序清单16.15 functor.cpp 16.5.1 函数符概念 正如 STL定义了容器和迭代…

数据结构和算法入门

1.了解数据结构和算法 1.1 二分查找 二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半,然后比较目标值与中间元素的大小关系,从而确定应该在左半部分还是右半部分继续查找。这个…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏:基于 HTML 和 ECharts 的实现 随着科技的不断进步,智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化,安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态,从而提高应急响…

XSS攻击与CSRF攻击

XSS攻击 XSS(Cross Site Scripting,跨站脚本攻击),是指攻击者利用站点的漏洞,在表单提交时,在表单内容中加入一些恶意脚本,当其他正常用户浏览页面,而页面中刚好出现攻击者的恶意脚…

ffmpeg更改视频的帧率

note 视频帧率调整 帧率(fps-frame per second) 例如:原来帧率为30,调整后为1 现象:原来是每秒有30张图像,调整后每秒1张图像,看着图像很慢 实现:在每秒的时间区间里,取一张图像…

【数据结构】手把手教你单链表(c语言)(附源码)

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 1.单链表的概念与结构 2.单链表的结构定义 3.单链表的实现 3.1 单链表的方法声明 3.2 单链表方法实现 3.2.1 打印链表 3.2.2 创建新…

四、GD32 MCU 常见外设介绍(8)SPI 模块介绍

串行外设接口(Serial Peripheral Interface,缩写为 SPI) 提供了基于SPI 协议的数据发送和接收功能, 可以工作于主机或从机模式。 SPI 接口支持具有硬件 CRC 计算和校验的全双工和单工模式。 8.1.SPI 基础知识 SPI 物理层 SPI接…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统,近期要在项目中上线了。因为PACS系统采用无权限认证&…

qt--电子相册

一、项目要求 设计一个电子相册&#xff0c;点击上一张&#xff0c;切换到上一张图片&#xff0c;点击下一张&#xff0c;切换到下一张图片。 要求&#xff1a;图片的展示可以循环&#xff08;QList<QString>&#xff09; 要求&#xff1a;界面美观 二、项目代码 本质是通…

概率论--矩估计

目录 简介 矩估计法的基本步骤 延伸 矩估计法在大样本情况下的准确性和有效性如何评估&#xff1f; 在实际应用中&#xff0c;矩估计法的局限性有哪些具体例子&#xff1f; 如何处理矩估计法在某些情况下可能出现的不合理解或无法唯一确定参数的问题&#xff1f; …

vue3前端开发-小兔鲜项目-form表单的统一校验

vue3前端开发-小兔鲜项目-form表单的统一校验&#xff01;实际上&#xff0c;为了安全起见&#xff0c;用户输入的表单信息&#xff0c;要满足我们的业务需求&#xff0c;参数类型等种种标准之后&#xff0c;才会允许用户向服务器发送登录请求。为此&#xff0c;有必要进行一次…

gstreamer使用cairo实现视频OSD叠加

前言 gstreamer中视频叠加OSD有很多种方式&#xff0c;比如textoverlay添加文字&#xff0c;gdkpixbufoverlay添加图片&#xff0c;clockoverlay或timeoverlay插件显示时间&#xff0c;pango插件进行复杂文本渲染&#xff0c;使用cairo插件绘制图形或者文字。 今天使用最后一…

【React】详解样式控制:从基础到进阶应用的全面指南

文章目录 一、内联样式1. 什么是内联样式&#xff1f;2. 内联样式的定义3. 基本示例4. 动态内联样式 二、CSS模块1. 什么是CSS模块&#xff1f;2. CSS模块的定义3. 基本示例4. 动态应用样式 三、CSS-in-JS1. 什么是CSS-in-JS&#xff1f;2. styled-components的定义3. 基本示例…

ADS 使用教程(二十八)Working with FEM Mesh Field Data in ADS

ADS 使用教程&#xff08;二十七&#xff09;Getting Started with Full 3D FEM Simulation in ADS 在这一节中&#xff0c;我们来谈论一下在ADS中处理有限元法&#xff08;FEM&#xff09;网格和场数据的步骤。 在上一节中&#xff0c;我们进行了FEM仿真&#xff0c;并保存了…

在 MinIO 使用 SVE 将 ARM 带入人工智能数据基础设施领域

MinIO 性能如此之高的原因之一是&#xff0c;我们做了其他人不会或不能做的细粒度工作。从 SIMD 加速到 AVX-512 优化&#xff0c;我们已经完成了艰巨的任务。ARM CPU 架构的最新发展&#xff0c;特别是可扩展矢量扩展 &#xff08;SVE&#xff09;&#xff0c;为我们提供了比前…

《Cross-Modal Dynamic Transfer Learning for Multimodal Emotion Recognition》

Multi-modal系列论文研读目录 文章目录 Multi-modal系列论文研读目录1.ABSTRACT2.INDEX TERMS3.INTRODUCTION4.RELATED WORKSA. MULTIMODAL EMOTION RECOGNITION 多模态情感识别1) CONVENTIONAL FUSION METHODS 常规融合方法2) TRANSFORMER-BASED FUSION METHODS 基于变压器的融…

2023河南萌新联赛第(二)场 南阳理工学院

A. 国际旅行Ⅰ 题目&#xff1a; 思路&#xff1a; 因为题意上每个国家可以相互到达&#xff0c;所以只需要排序&#xff0c;输出第k小的值就可以了。 AC代码&#xff1a; #include<bits/stdc.h> #define int long long #define IOS ios::sync_with_stdio(0);cin.tie…

2024 微信小程序 学习笔记 第二天

1. WXML 模板语法 数据绑定 事件绑定 条件渲染 列表渲染 2. WXSS 模板样式 rpx 样式导入 全局和局部样式 3. 全局配置 window tabBar 配置tabBar案例 4. 网络数据请求 Get请求 Post 请求 加载时请求 5. 案例 -本地生活&#xff08;首页&#xff09; 导航栏 轮播图 九宫格效果…

webpack插件给所有的:src文件目录增加前缀

1.webpack4的版本写法 class AddPrefixPlugin {apply(compiler) {compiler.hooks.compilation.tap(AddPrefixPlugin, (compilation) > {HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync(AddPrefixPlugin,(data, cb) > {// 使用正则表达式替换所有包含 /st…