shell 脚本的基础

news2024/12/25 9:20:14

目录

一、什么是shell脚本

二、有哪些表达式

一、变量

二、运算符

三、语句类型分哪几种

一、条件语句

二、分支语句

三、循环语句

四、函数

五、正则表达式

一、标准正则

二、扩展正则

六、文件操作四剑客

七、shell

一、shell是一种命令解释器

二、查看系统中支持的shell

三、查看系统默认的shell

八、变量

一、变量的组成

一、变量名

一、声明规范

二、声明方法

 ​编辑

二、变量值

二、变量的类型

一、系统内置变量(环境变量)

二、自定义变量

三、位置变量

四、预定义变量

三、作用域

四、输出

五、shell中的字符串

一、获得字符串长度

二、字符串取子串

三、字符串截取

四、字符串拼接

五、字符串替换

九、运算符

一、数学运算

二、比较运算

一、条件测试

二、数值比较

三、字符串比较

四、文件比较

五、逻辑运算符

 十、shell运行规则

十一、shell运行规则

一、没有x权限

二、有x权限


一、什么是shell脚本

Shell脚本是一种用于自动化操作系统任务的脚本语言。它是一种通过命令行界面执行的脚本,用于执行一系列的命令和操作,可以实现自动化的系统管理、文件处理、网络通信等操作。

Shell脚本通常运行在Unix或类Unix操作系统(如Linux)的命令行环境中。它使用一种脚本语言,可以调用操作系统提供的命令和工具,以及用户自定义的函数,实现一系列的操作和任务。

Shell脚本是纯文本文件,通常以.sh或.bash等扩展名结尾。它可以包含变量定义、条件判断、循环结构、函数定义等语法元素,用于实现复杂的逻辑和控制流程。

通过编写Shell脚本,用户可以批量执行一系列命令、处理大量的文件、定时执行任务、自动化系统管理等。Shell脚本是系统管理员、开发人员和运维人员常用的工具之一,能够极大地提高工作效率和操作方便性。

二、有哪些表达式

一、变量

预定义变量

位置变量

自定义变量

二、运算符

数学运算

数值比较

字符串比较

文件判断

布尔运算符

三、语句类型分哪几种

一、条件语句

if

二、分支语句

case

三、循环语句

for

while

四、函数

在Shell脚本中,函数是一种用于封装一系列命令和操作的结构。函数可以在脚本中定义和调用,它们使代码更模块化、可重用和易于维护。下面是一些关于Shell脚本函数的重要特点和介绍:

  1. 定义函数:在Shell脚本中,使用如下语法来定义函数:

    function_name() {
        # 函数体
    }
    

    函数名可以由字母、数字和下划线组成,不能以数字开头。函数体是一系列的命令和操作,用于实现特定的功能。

  2. 调用函数:在脚本中,可以通过函数名来调用相应的函数,如下所示:

    function_name
    

    调用函数时,脚本会执行函数体中的命令和操作。

  3. 函数参数:函数可以接受参数,以便在调用时传递数据给函数。参数使用特殊变量 $1$2$3 等表示,分别代表第一个、第二个、第三个参数,以此类推。在函数中可以使用这些变量来获取传入的参数值。

  4. 函数返回值:函数可以通过 return 语句返回一个值。返回值可以是一个整数或字符串,使用 return 语句后,脚本会终止当前函数的执行并返回该值。在调用函数时,可以使用 $() 或反引号来获取函数的返回值。

  5. 局部变量:在函数内部,可以使用 local 关键字声明局部变量。局部变量的作用范围仅限于函数内部,不会对外部的同名变量产生影响。

  6. 函数调用的结果:在脚本中可以使用特殊变量 $? 来获取函数调用的结果。如果函数执行成功,则 $? 的值为 0;如果函数执行失败,则 $? 的值不为 0。

函数在Shell脚本中起到了组织和模块化代码的作用,可以增强代码的可读性、可重用性和可维护性。使用函数可以封装一些常用的操作,减少代码的重复编写,并提高脚本的效率和可扩展性。

五、正则表达式

一、标准正则

  1. 标准正则表达式(BRE):

    • 基本元字符:.*[]^$
    • 限定符:*+?{m,n}
    • 字符类:[...]
    • 反向引用:\n
    • 范围表达式:[a-z][0-9]
    • 特殊字符转义:\
    • 匹配行首和行尾:^$

    在Shell中,默认情况下,正则表达式都使用标准正则表达式的语法。使用标准正则表达式时,不能直接使用元字符.|等,而是将它们作为普通字符进行匹配。

二、扩展正则

  1. 扩展正则表达式(ERE):

    • 扩展元字符:.*[]^$|(){}+?
    • 集合:[[:alnum:]][[:digit:]]
    • 字符类简写:\w\d\s
    • 分组:(pattern)
    • 逻辑操作符:|
    • 或操作符:?|pattern1|pattern2|...
    • 非贪婪操作符:*?+???
    • 扩展的范围表达式:{m,}{,n}{m,n}

    使用扩展正则表达式时,可以使用更多的特殊字符和语法来匹配和处理文本。

在Shell脚本中,可以使用工具如grepsed等来利用正则表达式进行文本的处理和匹配。

六、文件操作四剑客

1、find

2、egrep

3、sed

4、awk

七、shell

一、shell是一种命令解释器

  1. sh(Bourne Shell):是Unix操作系统中最早的Shell,功能相对较简单。其脚本文件通常以.sh为扩展名,可以在大多数Unix系统中使用。

  2. ssh(Secure Shell):是一种网络协议,用于在不安全的网络中提供安全的远程登录和文件传输。它也可以用作Shell脚本的远程执行工具。

  3. bsh(Bourne Again Shell):是Bash Shell的简称,是Bourne Shell的改进版本,为Unix和Linux系统提供了更多的功能和特性。

  4. csh(C Shell):是一种与C语言类似的Shell,具有更丰富的交互式功能,并提供了一些与C语言兼容的语法。

  5. bash(Bourne Again Shell):是Unix和Linux系统中最常用的Shell,也是默认的命令行解释器。它是基于Bourne Shell的改进版本,提供了很多功能和扩展。

  6. tcsh(TENEX C Shell):是C Shell的改进版本,增加了一些交互式和脚本编程的功能。

  7. dsh(Distributed Shell):是一个用于在多台远程主机上同时执行命令的工具,可以实现批量远程命令执行。

  8. zsh(Z Shell):是一个强大的Shell解释器,具有高级的命令补全、历史命令管理、拼写校正等特性,并提供了良好的脚本编程能力。

二、查看系统中支持的shell

cat /etc/shells

三、查看系统默认的shell

echo $SHELL

八、变量

一、变量的组成

一、变量名

不会变化

可以理解为一个容器 只是里面装的内容不一样而已

一、声明规范

不能是数字或者数字开头

要以_或字母开头

变量名不能包含特殊字符

二、声明方法

驼峰式   userName

 

双驼峰 UserName

NameALL这种也是双驼峰型

shell写法

user_name

username

USERNAME(在shell脚本中大写的字母一般用来表示常量或者全局变量)

二、变量值

不断变化 承载的物体(里面可以装任何东西,不固定)

数字、字符 

二、变量的类型

一、系统内置变量(环境变量)

env

二、自定义变量

定义一个变量名,定义一个变量值 用赋值符号连接

varName=varValue

等号两边不能有空格

数字    var1=1

字符串
shell中可以不使用引号
当包含有空格时,需要使用引号

引号的用法      不会引用变量值    单引号  '
会应用变量值   双引号   "
引用命令结果   反撇号   `
$(命令)
应用场景较多

三、位置变量

$0表示自身
$1表示位置参数
$@

表示所有参数的列表

脚本内只能设置九个位置变量脚本外不受限制

脚本后参数所在的位置就是位置变量(默认有9个位置变量 $1...$9)

 相当于运行脚本的时候把后面两个参数一起传进来

直接启动没有颜色,但是ls有特殊性可以不跟参数

 他是要调个别名

想让他恢复颜色

再次更改脚本

保存退出并验证

成功 

传参数

./first.sh /opt/ /home/ (正着填写,反着验证)


 

特性只能从第一个位置变量跟到第九个位置变量

四、预定义变量

$0      脚本本身的名称 (运行自己)

脚本配置文件开头的格式应该是#! /bin/bash

代表从此刻开始所有的语句都是由bin/shell解析

 赋予权限

一直运行自己

查看带颜色的脚本

.$#    脚本后参数的个数 (输出脚本后跟的位置变量的个数)

 查看到底传进来几个参数

更改脚本 添加 echo $# 并验证

 

 成功显示参数的个数

以此类推 每追加在验证 都会出现变化

如果加很多,他最多也只调9个,后面的调不出来,但是参数的个数正常显示

 $* 脚本运行时参数的内容(整体输出 位置变量参数的内容)

验证

最下面单独显示了一遍结果 

$@ 脚本运行时参数的内容(逐个输出 位置变量的内容)

验证 

 显示结果一致,$@是拼接式输出 不会换行 显示一样但是并不一致

验证脚本

 第七行 逐个输出$*的内容

echo输出会换行检质

想要区别 $* 和 $@的区别 就写这样一个脚本

并验证

$? 脚本运行完毕后的返回值

默认情况 0成功 非0失败

这种提示成功

 这种则提示失败

三、作用域

默认变量只在当前shell下生效

定义一个值 验证后刷新,在验证则失效 

 这种就是局部变量只在当前shell下生效 (刷新等于开启了一个子shell,不生效)

若要在当前及其子shell下生效,需要声明为全局变量    export (将局部变量升级为全局变量,全局变量不是在任意的shell下都可以调,必须是当前shell及其子shell才可以,切新shell则无效)

 验证则成功生效

四、输出

echo $varName

五、shell中的字符串

举例 先赋值  str1=foodfornoting.gpg

一、获得字符串长度

echo ${#str1}

语法:    ${#StringName}

 显示结果为 17个字符

二、字符串取子串

echo ${str1:0:3} 从哪里开始 取几个  从0就是从第一个开始 往后三个则显示foo

如果是 -4的话则是从左往右 显示 foodfornoting

语法:    ${#StringName:position:lenght}

三、字符串截取

1、echo ${str1##*fo}  从左至右截取最后一个匹配字符串string之后的所有字符串

从左往右查找最后的字符显示后面的内容

语法:    ${StringName##*string}

2、echo ${str1#*fo} 从左至右截取第一个匹配字符串string之后的所有字符串

从左往右查找第一个字符的内容并显示后面的内容

语法:    ${StringName#*string}

3、echo ${str1%%o*}  从右至左截取最后一个匹配字符串string之后的所有字符串

从右往左查找最后一个字符串并显示后面的内容

语法:    ${StringName%%string*}    

4、echo ${str1#*fo} 从左至右截取第一个匹配字符串string之后的所有符串

语法:    ${StringName#*string}

5、echo ${str2%%o*} 从右至左截取最后一个匹配字符串string之后的所有字符串

语法:    ${StringName%%string*}    

6、echo ${str2%o*} d)从右至左截取第一个匹配字符串string之后的所有字符串

语法: ${StringName%string*}

四、字符串拼接

StringName3=${StingName1}${StringName2}

五、字符串替换

语法:    ${StringName/OldString/NewString}

九、运算符

一、数学运算

+

-

*

因为*也有代表全部的意思 所以为了让系统识别是运算 要添加转义符 * 作为乘号时需要加转义符\

%(除)

shell不支持浮点数的显示

二、比较运算

一、条件测试

二、数值比较

-eq    等于  echo $? 查看结果 0显示成功 非0表示失败


        -ne    不等于


        -lt    小于


        -le    小于等于


        -gt    大于


        -ge    大于等于

 test          测试

三、字符串比较

=  字符串一致

!= 字符串不一致

-z 字符串为空

!     -z   字符串不为空

四、文件比较

 -e 文件或目录是否存在


 -f        是否为文件


 -d        是否为目录


  -r        判断文件是否可读


 -w        判断文件是否可写


 -x        判断文件是否可执行

 

五、逻辑运算符

 十、shell运行规则

shell脚本编写规范
第一行    #!/bin/bash
第二行    #脚本的说明
第三行    脚本正文

十一、shell运行规则

一、没有x权限

bash  脚本所在路径/脚本文件

source 脚本所在路径/脚本文件

.      脚本所在路径/脚本文件

二、有x权限

./脚本文件

脚本绝对路径/脚本文件

shell脚本运行追踪     bash -x 脚本所在路径/脚本文件

echo $[$RANDOM%100]   返回100内随机数

 seq 1 10      返回1到10 的连续数字

{1..10}           返回1到10 的连续数字

seq 1.1 10.1          返回1.1 2.1 3.1.... 10.1

 

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

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

相关文章

esp-idf的电源管理——esp系列芯片的功耗管理硬件

1 芯片的供电 当我们为芯片设计外围电路时,必然会设计供电电路,这是芯片能正常工作的前提。通常是电源电压通过一个稳压电路之后给到芯片的供电引脚。以S3为例,下面是S3的引脚图: 其中以VDD打头的就是供电引脚。比如VDD3P3、VDDA等。供电引脚不止一个,这些供电引脚有什么…

一百六十二、Kettle——Linux上安装的Kettle9.2创建共享资源库

一、目的 在实际的团队开发过程中,不可能将自己的转换、作业和调度等配置存放在自己的电脑中,所以kettle提供资源库的方式,供我们将转换、作业等存储下来,构成一种协作平台。 Kettle支持的资源库类型有三种: 1.Pent…

Python资源楼:40份干货资料+思维导图

盖个楼,收集了社区的Python资料,方便大家查看。 (说盖楼好像也不对,叫索引?呵呵不管了) 一段小前言(首帖要好看点): Python语法简单,很容易上手&#xff0c…

探索大模型时代下的算法工程师前景与发展路径

文章目录 大模型时代的挑战与机遇从算法到工程:技能升级的必要性发展路径与职业规划路径一:深耕研究领域路径二:工程实践与部署路径三:跨界合作与解决复杂问题路径四:教育培训和技术普及 不断学习与更新知识结论 &…

Ubuntu16.04-ros环境搭建笔记=1=

tips:搬运资料,留个记录 安装Ubuntu Ubuntu官网下载地址 安装 虚拟机安装Ubuntu 最好断网安装Ubuntu,可以节约时间 Ubuntu基础设置 Ubuntu换国内源 sudo apt upgrade可以看到镜像已经换过来了 VMwareTool安装 把这个压缩包拖到桌面&…

【以太网通信】RS232 串口转以太网

最近和 RK 研发同事在调试通信接口,排查与定位 RK3399 接收数据出错的问题。FPGA 与 RK3399 之间使用一路 RS232 串口进行通信,由于串口数据没有分包,不方便排查问题,想到可以开发一个 RS232 串口转以太网的工具,将串口…

【C语言】通讯录(文件) -- 详解

⚪前言 前面介绍了【C语言】静态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客和【C语言】动态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客。当通讯录运行起来时,可以对通讯录中的数据进行增加、删除或修改等。此时数据是存放在内存中,当程序退出时&…

不可忽略:冒烟测试到底有多重要?

冒烟测试介绍 冒烟测试一词,来源于电路板测试:电路板拼接或组装完成后,进行通电测试,如果冒烟,则说明存在缺陷。 而软件应用中,对其的定义为:在软件开发过程中的一种针对软件版本包的快速基本…

双亲委派机制,懂吧~ 那什么情况下需要破坏它,知道吗?

一、什么是双亲委派机制? 我们要获得一个类的Class实例,可以采用如下方式: 那么在Class的forName(className)方法中,会根据是谁调用了Class.forName(className)这个方法,那么就获得当时加载了它的那个ClassLoader&…

uniapp选择只选择月份demo效果(整理)

<template><view style"margin-top: 200rpx;"><!-- mode"multiSelector" 多列选择器 --><view><picker :range"years" :value"echoVal" change"yearChange" mode"multiSelector">{…

【面试题】2、Docker和Spring相关

1、Docker是什么&#xff1f; &#xff08;1&#xff09;Docker是一个快速交互、运行应用的技术&#xff0c;可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;该镜像可以迁移到任意的Linux操作系统 &#xff08;2&#xff09;运行时利用沙箱机制形成隔离容器&…

【JasperReports笔记04】如何使用Jasper Studio制作父子报表,并且通过Java + Parameters参数填充模板文件

这篇文章&#xff0c;主要介绍如何使用Jasper Studio制作父子报表&#xff0c;并且通过Java Parameters参数填充模板文件。 目录 一、JasperReports实现父子报表 1.1、运行效果 1.2、制作模板 &#xff08;1&#xff09;制作子报表 &#xff08;2&#xff09;制作子报表的…

计算机竞赛 图像检索算法

文章目录 1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 图像检索算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff…

0101读写分离测试-jdbc-shardingsphere-中间件

文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言 shardingshpere-jdbc定位为轻量级 Java 框架&#xff0c;在 Java 的 JDBC 层提供的…

处理Selenium3+python3定位鼠标悬停才显示的元素

这篇文章主要介绍了Selenium3python3--如何定位鼠标悬停才显示的元素 &#xff0c;文中通过简单代码给大家介绍的非常详细,需要的朋友可以参考下 先给大家介绍下Selenium3python3--如何定位鼠标悬停才显示的元素 定位鼠标悬停才显示的元素&#xff0c;要引入新模块 # coding…

Tableau画图

目录 蝴蝶图 四象图 排序图 盒型图/散点图 圆环图 火柴图 直方图 瀑布图 地理图 面积图 树地图 面积图 条形图 词云图 双轴图 填充地图 tableau2023.2 须知 蝴蝶图 拉好数据之后 创建新字段正负销售额&#xff0c;并拖入第一个颜色标记卡 四象图 智能推荐 散…

使用句子嵌入的无监督文本摘要

一、说明 这是一个AI研究生班的作业练习&#xff0c; 在本文中&#xff0c;我将描述我用来在 Python 中执行文本摘要的方法&#xff0c;这是我在导师分配给我的很棒的任务列表之一。 二、什么是文本摘要&#xff1f; 文本摘要是从一个或多个源中提取最重要的信息以生成特定用户…

华为ENSP网络设备配置实战4(OSPF+BGP+VPN+单臂路由)

题目要求 1、loopback口通过OSPF连通&#xff0c;合理规划OSPF开销&#xff0c;通过设置AR1->AR2->AR4链路&#xff0c;来消除负载链路。 2、AR3、AR4分别与AR1、AR2建立BGP邻居 3、AR3、AR4作为PC机网关设备 4、PC1、PC3由VPN-spi承载&#xff0c;PC2、PC4由VPN-spims承…

【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

611. 有效三角形的个数 611. 有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/ 题目描述&#xff1a; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 解题思路&#xff1a; 本题是一个关于三角形是否能成立…

通过爬虫抓取上市企业利润表并在睿思BI中展示

睿思BI从v5.3开始支持网络爬虫&#xff0c;可以从指定URL抓取表格数据&#xff0c;本示例实现从网络上抓取上市企业招商银行的利润表数据&#xff0c;并在睿思BI中进行展现。 首先&#xff1a;从搜狐财经抓取招商银行利润表数据&#xff0c;操作过程如下&#xff1a; 1.在睿思…