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

Linux--shell脚本语言—/—<1>

一、shell简介

        Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支

        Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。它既是一种命令语言,又是一种程序设计语言。以下是一些Shell编程的常见用途:

         自动化任务:使用Shell编程可以编写脚本来执行一系列的任务,如备份文件、定时执行任务、自动化测试等。

        • 系统管理:通过Shell编程可以管理系统的各种配置和操作,如安装软件、配置网络、管理用户等。

        • 数据处理:Shell编程提供了对文本文件的强大处理能力,可以通过脚本来处理和分析数据,如提取特定的信息、转换数据格式等。

        • 系统监控:使用Shell编程可以编写脚本来监控系统的运行状态,如CPU使用率、内存占用等,并根据条件执行相应的操作。

        • 安全管理:通过Shell编程可以编写脚本来执行一系列的安全管理任务,如检查和修复系统漏洞、监控日志等。

二、Shell环境

        Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

        Linux 的 Shell 种类众多,常见的有:     Bourne Shell(/usr/bin/sh或/bin/sh)、 Bourne Again Shell(/bin/bash) 、C Shell(/usr/bin/csh)、 K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)          

        在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。 #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

三、实操shell脚本

        例如在虚拟机内部的终端环境下,使用命令vim a.sh 生成并打开sh脚本文件编辑模式,其后缀名用sh表示其为脚本代码,在其中写入脚本代码如下,然后点击esc输入冒号+wq保存退出

其中的#!bin/sh 或者#!bin/bash是一条提示信息,它是用于指定脚本文件使用的Shell解释器,如果脚本文件开头是 "#!bin/sh",那么当你执行这个脚本时,系统会自动查找并使用 "/bin/sh" 解释器来执行脚本中的命令。

运行脚本语言,使用命令sh a.sh,以sh命令来指示其为脚本文件,其输出结果如下

        注:在虚拟机内运行不美观不好用,所以我就使用vscode 编辑器,但是不能使用版本太新的,因为我使用的是centos开发版,它停止维护了,所以新版本的vscode不能对其进行远程连接,老版本的可以连接。

        使用命令 chmod +x ./a.sh ,给脚本文件a.txt的每个用户都增加执行权限,再使用./a.sh执行脚本

        注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找

        作为解释器参数: 这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

四、基础语法

1、shell变量

        变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则

        在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。 这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。例如在C语言或者 C++ 中,变量分为整数、小数、字符串、布尔等多种类型。当然,如果有必要,你也可以使用 Shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。

2、变量的三种定义方式

        • variable=value 直接写

         variable='value' 用单引号括起来,此时内部如果有转义字符也会被当成字符直接输出

        • variable="value" 用双引号括起来,内部如果有转义字符,会被识别为转义字符输出

例如:定义几个变量,其中echo可以看成是print,$符用来指示后面的字符串是变量,而不是一个单独的字符串

        

其打印结果为:

3、Shell 变量的命名

        规范和大部分编程语言都一样: 变量名由数字、字母、下划线组成; 必须以字母或者下划线开头; 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

4、使用变量

使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

        如果不给 skill 变量加花括号,写成echo "I am good at $skillWeb",解释器就会把 $skillWeb 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

5、修改变量值

已定义的变量,可以被重新赋值,如:

第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。

6、单引号和双引号的区别

        定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:

其输出结果为:

        以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。        

        以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

7、将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

         variable=`Shell` 用反应号括起来

        variable=$(Shell)

        第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;

        第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

8、只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

面的例子尝试更改只读变量,结果报错

其作用为,先定义一个变量myurl,然后使用命令readonly将更改为只读变量,后面一条命令为重新为变量myurl赋值,但是前面已经定义它为只读变量了,所以结果报错:

9、删除变量

使用unset命令删除变量,其语法如下:

变量被删除后不能再次使用;unset 命令不能删除只读变量

例如:

定义变量mrurl后使用unset删除,后面再使用echo打印这个变量,结果为空:

10、shell传递参数

        我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

代码文件内容为这段

使用终端直接运行文件时需在后面加上参数数据,其输出结果如下:

因为系统会识别第一条文件名当做第0条参数,所以使用了$0将其打印出来,$1代表第一个参数,$2代表第二个参数.....

即如果将$0注释了,得到如下结果

1、特殊字符处理参数说明:

例如:

执行脚本:

其输出结果为:

                ​​​​​​​    

2、$* 与 $@ 区别:

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。

        假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

例如:

 

$*相当于将所有参数以一个字符串的形式输出,而$@则将所有参数以一个一个的字符串分别输出

相关文章:

Linux--shell脚本语言—/—<1>

一、shell简介 Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构&am…...

【java框架开发技术点】通过反射机制调用类中的私有或受保护的方法

示例 假设我们有一个类 ExampleClass,其中有一个私有方法 privateMethod: public class ExampleClass {private void privateMethod(String message) {System.out.println("Private method called with message: " + message);} }我们可以使用上述代码来调用这个…...

你知道这些鼎鼎大名的Java底层核心公司吗

在讨论Java虚拟机——JVM的时候,有几个知名的,不得不提到的JVM的产品和公司。 一、Oracle HotSpot:这是由Sun公司开发的虚拟机。它由最初的Classic VM开始,到推出崭露头角的Exact VM的虚拟机,是现代化高性能虚拟机的最…...

C++入门级文章

一、一个用于查询C标准库内函数、操作符等的链接 https://legacy.cplusplus.com/reference/ 声明:该文档并非官方文档,但其具有易于查询和使用的优势,足够日常使用。 二、C的第一个程序 1、C语言中的语法在C中仍旧适用,首先我们来…...

modelsim仿真quartus IP

开发环境:quartus prime pro 20;modelsim se-64 10.6d 1. 生成Altera的IP库 使用quartus生成IP库,需要使用Simulation Library Compiler(Tools->Launch Simulation Library Compiler) 如下图操作,选择…...

PCB设计经验——布线原则

1.连线精简——避免直角布线 导线也应看作一种元器件,有自己的电阻,电感,电容 PCB走线在直角转弯的地方,信号前后部分相互影响,导致分布电容增加,对信号上升沿和下降沿有延缓影响。从阻抗的角度来说&#…...

C++进阶:设计模式___适配器模式

前言 在C的基础语法的学习后,更进一步为应用场景多写代码.其中设计模式是有较大应用空间. 引入 原本在写容器中适配器类有关的帖子,发现适配模式需要先了解,于是试着先写篇和适配器模式相关的帖子 理解什么是适配器类,需要知道什么是适配器模式.适配器模式是设计模式的一种.笔…...

“八股文“在现代编程面试中的角色重塑:助力、阻力还是桥梁?

🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…...

Android 安装应用-浏览阶段

应用安装的浏览阶段主要是由PackageManagerService类中的scanPackageNewLI()实现的,看一下它的代码: // TODO: scanPackageNewLI() and scanPackageOnly() should be merged. But, first, commiting// the results / removing app data needs to be move…...

JavaEE 初阶(10)——多线程8之“单例模式”

目录 一. 设计模式 二. 单例模式 2.1 饿汉模式 2.2 懒汉模式 a. 加锁synchronized b. 双重if判定 c. volatile关键字(双重检查锁定) 一. 设计模式 设计模式是在软件工程中解决常见问题的经典解决方案。针对一些特定场景给出的一些比较好的解决…...

Javascript常见设计模式

JS设计模式学习【待吸收】-CSDN博客 JavaScript 中的设计模式是用来解决常见问题的最佳实践方案。这些模式有助于创建可重用、易于理解和维护的代码。下面列出了一些常见的 JavaScript 设计模式及其代码示例。 1. 单例模式(Singleton) 单例模式确保一…...

JavaFX布局-SplitPane

JavaFX布局-SplitPane 常用属性orientationpaddingdividerPositionsdisable 实现方式Java实现fxml实现 一个拆分至少两个区域的容器支持水平、垂直布局可以拖动区域的大小初始化大小通过比例设置[0,1] 常用属性 orientation 排列方式,Orientation.VERTICAL、Orien…...

2.MySQL库的操作

创建数据库 创建数据库的代码: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...];​create_specification:[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_name 说明: 大写的表示关键…...

如何学习计算机

不要只盯着计算机语言学习,你现在已经学习了C语言和Java,暑假又规划学习Python,最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言,沿着这个方向继续往后学习知识就行。计算机语言是学不完的,而未来就…...

Spring MVC 快速入门指南及实战演示

1、SpringMVC简介 1.1 背景 Servlet属于web层开发技术,技术特点: 1. 每个请求都需要创建一个Servlet进行处理 2. 创建Servlet存在重复操作 3. 代码灵活性低,开发效率低 是否有技术方案可以解决以上问题? 1.2 SpringMVC概述 Sp…...

在线测评系统(未完结)

文章目录 注意!!!1、多模块开发(后端)(1).Maven依赖(2)swagger配置 2、判题机开发(1)docker 前言:大二刚开始接手了本学院的oj,并管理了一段时间,后来老师给我…...

Python 爬虫项目实战(一):破解网易云 VIP 免费下载付费歌曲

前言 网络爬虫(Web Crawler),也称为网页蜘蛛(Web Spider)或网页机器人(Web Bot),是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…...

PTA 6-7 统计某类完全平方数

6-7 统计某类完全平方数(20分) 本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。 函数接口定义: int IsTheNumber ( const int N );…...

PyFilesystem2 - Python 操作文件系统

文章目录 一、关于 PyFilesystem2二、安装三、快速使用四、指南为什么要使用 PyFilesystem ?打开文件系统树打印关闭目录信息子目录处理文件遍历 WalkingGlobbing移动和复制 五、概念路径系统路径沙盒错误 六、资源信息信息对象命名空间基本命名空间细节命名空间访问…...

Bug小记:关于servlet后端渲染界面时出现的问题小记1P

问题1: 问题描述: int delete(Integer Sno);后端在该方法调用时传入参数 req.getParameter("Sno")报错参数应该为Integer类型问题分析:后端通过请求获取到的前端数据都是字符串类型,需要手动转换参数类型 解决方法&a…...

智慧水务项目(二)django(drf)+angular 18 创建通用model,并对orm常用字段进行说明

一、说明 上一篇文章建立一个最简单的项目,现在我们建立一个公共模型,抽取公共字段,以便于后续模块继承,过程之中会对orm常用字段进行说明,用到的介绍一下 二、创建一个db.py 目录如下图 1、代码 from importlib im…...

<数据集>人员摔倒识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:8605张 标注数量(xml文件个数):8605 标注数量(txt文件个数):8605 标注类别数:1 标注类别名称:[fall] 序号类别名称图片数框数1fall860512275 使用标注工具&#xf…...

npm install 报错 ‘proxy‘ config is set properly. See: ‘npm help config‘

解决 参考链接:npm install 报错 ‘proxy‘ config is set properly. See: ‘npm help config‘-阿里云开发者社区 (aliyun.com)...

爬虫问题---ChromeDriver的安装和使用

一、安装 1.查看chrome的版本 在浏览器里面输入 chrome://version/ 回车查看浏览器版本 Chrome的版本要和ChromeDriver的版本对应,否则会出现版本问题。 2.ChromeDriver的版本选择 114之前的版本:https://chromedriver.storage.googleapis.com/index.ht…...

Spring的配置类分为Full和Lite两种模式

Spring的配置类分为Full和Lite两种模式 首先查看 Configuration 注解的源码, 如下所示: Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Configuration {AliasFor(annotation Component.class)String value() defau…...

探索Perl的代码生成艺术:利用编译器后端释放潜能

探索Perl的代码生成艺术:利用编译器后端释放潜能 Perl,作为一种解释型语言,通常不通过编译器后端直接生成机器代码。然而,通过一些高级技术,Perl 程序员可以利用编译器后端来生成代码,从而提高性能或实现特…...

21 B端产品经理之技术常识(1)

产品经理需要掌握一些基本的技术知识。 了解公司前端与后端 前端 前端开发:创建WEB页面或APP等前端界面呈现给用户的过程,即前端负责用户界面交互。 前端技能: HTML:一种标记语言,能够实现Web页面并在浏览器中显示。…...

数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解

单链表理论知识详解 文章目录 单链表理论知识详解1.单链表的定义2.单链表的初始化3.单链表的插入和删除3.1 单链表的插入3.1.1 按位序插入3.1.2 在指定结点的前后插入一.后插操作二.前插操作 4.单链表的删除4.1 按位序删除4.2 指定结点的删除 5.单链表的查找5.1 按位序查找5.2 …...

【智能时代的创新工具】LangChain快速入门指南:轻松掌握语言模型的集成与运用

一、LangChain:连接语言模型与现实世界的桥梁 1.1 LangChain的定义与重要性 LangChain是一个开源的Python库,它旨在为开发人员提供一种简便的方式来集成和运用语言模型。它不仅仅是一个简单的API调用工具,而是一个具有丰富功能的框架&#x…...

文献阅读:细胞分辨率全脑图谱的交互式框架

文献介绍 文献题目: An interactive framework for whole-brain maps at cellular resolution 研究团队: Daniel Frth(瑞典卡罗林斯卡学院)、Konstantinos Meletis(瑞典卡罗林斯卡学院) 发表时间&#xff…...

网站设计的毕业论文题目有哪些/百度风云榜小说榜排名

介绍一些新手入门FPGA的优秀网站(新增4)之前有分享过《HDLBits》这个对于入门非常好的网站(学会使用Hdlbits网页版Verilog代码仿真验证平台),今天在推荐给大家一些优秀网站,无聊的时候可以去学习一些FPGA的…...

免费做网站的好不好/白酒最有效的推广方式

1.Task的分配 假设一个topology有4个worker,2个spout,2个bolt。spout1有4个task,spout2有2个task,bolt1有4个task,bolt2有4个task。(默认一个task对应一个Executor) storm会为每个task顺次分配t…...

春节网站怎么做/杭州seo托管公司推荐

Service与Broadcast应用实验报告 相关内容:(一)、声学实验1.声音的产生和空气能传声在一只塑料瓶中放一些小纸屑,敲击塑料瓶,可以观察到瓶底的小纸屑跳动起来,而不敲击时发现瓶底的小纸屑并不跳动。说明声音是由于物体的振动而产生…...

怎么样做网站代/百度搜索关键词排名人工优化

Google maps javascript API https://developers.google.com/maps/documentation/javascript/datalayer 。。。。 GeoJSON 是一种针对互联网上共享地理空间数据的通用标准,属于轻量版,而且便于人工读取,非常适合用于共享与协作。 posted on 2…...

山东省建设厅网站电话查询/表白网站制作

因为万科和宝能之争,突然注意到《门口的野蛮人》这本书还没看过,就在当当网下单买了一本。书的字数还挺多,熬夜点灯一周终于看完了这本著名的书,这才算是圆满。这本书的细节很丰富,所以看完之后收获很大,对…...

中国山东建设监理协会网站/线上推广渠道

JTopo交互式拓扑图Jtopo介绍和使用为什么需要Jtopo如何使用Jtopo场景相关设置节点相关设置官网参考Jtopo介绍和使用 Jtopo是一款完全基于HTML5 Canvas的数据关系交互式图形库,可以快速创建一些拓扑关系图、交互式图形软件、监控告警等可视化软件。 为什么需要Jtop…...