Linux下Shell脚本基础知识

主要参考视频:

这可能是B站讲的最好的Linux Shell脚本教程,3h打通Linux-shell全套教程,从入门到精通完整版_哔哩哔哩_bilibili

主要参考文档:

Shell 教程 | 菜鸟教程 (runoob.com)

Bash Shell教程 (yiibai.com)

先用视频入门,然后参考手册学习,之后实践总结。 

认识Shell和Bash

计算机里,我们基本都会使用操作系统,对于开发人员来说,我们肯定需要控制操作系统做一些事情,但是有个问题,那就是出于安全性考虑我们用户层没法直接访问操纵系统的内核,这种情况下,就有人提出解决方案,那就是在内核操作上套一层“壳”,也就是Shell,然后提供给用户一些指令,用户层再通过指令去完成要干的活,这样,就避免了直接操作内核,保证了内核的安全性以及系统的稳定性。

Shell命令就是由此而来,Shell命令按照一定格式组成的文本就是Shell脚本。

那Bash是怎么回事呢?

有Shell命令,那肯定要有命令的解释器,也就是将输入的命令转换成实际操作系统内核要干的活,其中,Bash就是Shell命令的解释器。

有了一种解释器,肯定就有它的优点和缺点,必然就会出现其他种类的解释器,各有各的特点,各有各的适用场景,于是,市场上就出现了多种Bash。

事实上,不同的Bash对应的Shell也有些不同。

Linux中默认使用Bash,我们操作Linux就需要学习各种Bash Shell。

Linux操作系统中有不同类型的Shell。其中一些如下:

  • Bourne Shell
  • C shell
  • Korn Shell
  • GNU Bourne Shell

要想知道操作系统支持哪种Shell类型,可在终端中输入以下命令:

cat /etc/shells

要想知道bash在操作系统中的位置,可键入以下命令,将获得一个特定的位置:

which bash

如下:

 

显示的都是绝对路径。 

Bash是Linux附带的标准Shell。它是当今最流行的开源Shell,并且具有在下一主题中阅读的各种生产功能。它也可用于Linux发行版,MacOS,Solaris 11和Windows 10。它通过许多改进为用户提供最佳体验。

Bash脚本

创建和执行

在计算机编程中,脚本是用于适当的运行时环境的一组命令,这些命令用于自动执行任务。

Bash Shell脚本是一个纯文本文件,其中包含一组通常在命令行中键入的各种命令。它用于在Linux文件系统上自动执行重复性任务。它可能包含一组命令或一个命令,或者可能包含命令式编程的标志,例如循环,函数,条件构造等。实际上,Bash脚本是用Bash编程语言编写的计算机程序。

如何创建和运行Bash脚本?

  1. 首先,使用cd命令进入保存脚本的目录;
  2. (如果已有脚本则跳过,否则)使用touch命令创建零字节大小的脚本,脚本以.sh作为扩展名(经验证,不以.sh结尾也可以,事实上,linux中没有扩展名的概念,之所以常常写扩展名,是为了方便人为查看);
    touch file_name
    
  3. 打开文本,并输入bash脚本的shell命令;
  4. 使用chmod赋予该脚本以可执行的权限(这一步别忘了,要不文件没有可执行权限);
  5. ./file_name来执行bash脚本(不在当前目录下就需要输入绝对路径或者相对路径);

比如,创建一个脚本,并输入如下内容:

#! /bin/bash
echo Hello World!

然后执行。

就会在终端打印出Hello World!

开头

每个基于Bash的Linux脚本都以以下行开头:

#!/bin/bash

这里#!称为shebang,该行的其余部分是解释器的路径,用于指定bash shell在操作系统中的位置。

shebang的格式很重要,格式不正确会导致命令工作不正常。因此,在创建脚本时,要始终记住SheBang格式的这两点:

  • 它应该始终在脚本的第一行。
  • #!和解释器的路径之间,#之前不应有任何空格。

经测试,貌似有空格也可以,不过,还是应当遵循标准规范。

注意,单独的#是注释。

注意,linux中路径是以撇/来分隔的,在windows下是以捺\作为分隔的。

echo

echo是bash中常用的linux命令

echo是Bash中的内置命令,用于通过传递参数来显示标准输出。它是用于将文本/字符串行打印到屏幕上的最广泛使用的命令。

echo命令 – 输出字符串或提取后的变量值 – Linux命令大全(手册) (linuxcool.com) 

单独的echo可以打印出空行。

比如:

显示结果定向至某个文件,也就是将显示结果写到某个文件里,其中>是重定向符号。

echo "It is a test" > myfile

关于引号

关于有无引号?

如果字符串是个整体,其实可以不用引号,shell也能识别为一个字符串。

但是,当字符串中有空格时,就有问题了,这是因为Bash使用空格来确定单独的项目。 这种情况下,引号就可以用于处理带有空格字符的文本和文件名。

关于单引号和双引号?

使用简单的文本和字符串时,我们使用单引号或双引号都不会有任何区别

但是,当涉及到变量引用时,就有区别了。

shell变量扩展仅适用于双引号。如果在单引号中定义变量,则不会将其视为变量。

下面通过一个例子来理解这一点:

变量

变量部分内容可参考:

Shell 变量 | 菜鸟教程 (runoob.com) 

之所以不能有空格,是因为bash是通过空格作为分隔的。

对于Bash,不必在变量声明时定义变量的数据类型。Bash变量是无类型的,只需通过分配其值来键入变量名称,它会自动判断数据类型。

如果将数字值分配给变量,它将自动转为整数工作,如果将字符值分配给该变量,则它将转为字符串类型。

year=2012  
comp_name=yiibai

使用echo命令,通过在名称之前加上美元($)号来读取它们,例如:

echo $year
echo $name

Shell或UNIX系统中都有两种类型的变量。

  • 系统定义的变量
  • 用户定义的变量

系统定义的变量

是由LINUX操作系统本身创建和维护的预定义变量。它们的标准约定是通常以大写字母进行定义。因此,每当看到以大写字母定义的变量时,很可能它们就是系统定义的变量。要了解系统中这些变量的列表,请在命令行终端上键入命令env或者printenv

用户定义的变量

这些变量由用户创建和维护。通常,这些类型的变量以小写形式定义。但是不强制的,也可以将变量名称写成大写。如下简单示例:

变量的操作

通常对Bash中的变量执行两个操作,如下所示:

  • 为变量设置值。
  • 读取变量的值。

设置变量值有几种方式,其中最常见的方法是直接设置值。

参考:Shell 变量 | 菜鸟教程 (runoob.com)

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

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

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

推荐给所有变量加上花括号,这是个好的编程习惯。

Bash检查识别每个变量后,它将用分配的值替换每个变量名。它解释/运行每一行代码,并针对脚本的每个编码行继续执行此过程。

注:Bash中的两种变量都可以在终端以及Bash脚本上使用

只读变量

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

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

删除变量

使用 unset 命令可以删除变量。语法:

获取字符串长度

数组

参考:Shell 变量 | 菜鸟教程 (runoob.com) 

Shell 数组 | 菜鸟教程 (runoob.com)

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

传递参数

参考:Shell 传递参数 | 菜鸟教程 (runoob.com)

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

例如可以使用 $1、$2 等来引用传递给脚本的参数,其中 $1 表示第一个参数,$2 表示第二个参数,依此类推。

另外,还有几个特殊字符用来处理参数:

命令替换

其实就是获取命令执行的结果作为最终的内容。

替换的经典形式是使用反引号,如下所示:

也可以通过将命令放在圆括号(以美元符号($)开头)中来进行命令替换。如下:

示例:

读取用户输入

读取Bash用户输入,需要使用内置的Bash命令read。它用于从用户处获取输入并分配给变量。它仅从Bash shell中读取一行。以下是read命令的语法。

read <variable_name>

以下是从Bash脚本读取用户输入的示例:

运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

反引号,其实就是将expr命令执行的结果作为最终的结果值。

两点注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,而是在 Esc 键下边的反引号。

更多直接参考

Shell 基本运算符 | 菜鸟教程 (runoob.com)

注意:注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。注意,这里面有四个空格,从方括号开始后面就有空格了。

比较新奇的一个字符串运算符

条件语句-if

注意:在 sh/bash 里,如果 else 分支没有语句执行,就不要写这个 else分支。

Shell 流程控制 | 菜鸟教程 (runoob.com)

以if开头,以fi结尾。

有if就要搭配then,最后分支的else可以不用。

条件放在方括号[……]里。我看两个参考文档里,有的说条件后要加分号,有的又没有加,比较混乱。参考下这篇:shell中的if语句 - 开始认识 - 博客园 (cnblogs.com)

再参考这篇:

Shell if else语句(详解版) (biancheng.net)

可知:

当then和if处于同一行时,分号;才是必须的。

双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。
注意:(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算

选择语句-case

case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case ... esac 语法格式如下:

更多参考:

Shell 流程控制 | 菜鸟教程 (runoob.com)

循环语句

Shell 流程控制 | 菜鸟教程 (runoob.com)

for循环 while循环 until循环

for循环

shell三种 for循环方式_shell 循环100次-CSDN博客

参考:

Bash for循环 - Bash Shell教程 (yiibai.com)

注意,for-in中列表是以空格来分开每一项。

更多直接参考:

Shell 流程控制 | 菜鸟教程 (runoob.com)

函数

直接参考即可:

Bash函数 - Bash Shell教程 (yiibai.com) 

文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Shell 文件包含的语法格式如下:

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

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

相关文章

基于springboot实现火锅店管理系统项目【项目源码+论文说明】

基于springboot实现火锅店管理系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装火锅店管理系统软件来…

编译一个叫:未来的IDE-Zed编辑器(Windows平台)

一、前言 截止到2024-6-15&#xff0c;Zed官方并未给出Windows的二进制安装包&#xff0c;如果想在Windows平台使用的话需要自己编译&#xff0c;我是如何编译的请随我道来&#xff0c;有兴趣的码友可以尝试下&#xff0c;在下可不敢保证各位码友按我这方法能100%编译出来&…

【JavaEE进阶】——利用框架完成功能全面的图书管理系统

目录 &#x1f6a9;项目所需要的技术栈 &#x1f6a9;项目准备工作 &#x1f388;环境准备 &#x1f388;数据库准备 &#x1f6a9;前后端交互分析 &#x1f388;登录 &#x1f4dd;前后端交互 &#x1f4dd;实现服务器代码 &#x1f4dd;测试前后端代码是否正确 &am…

一些硬件知识(十)

MOS管当开关控制时&#xff0c;一般用PMOS做上管&#xff0c;NMOS做下管 细说MOS管知识-MOS管高端驱动与低端驱动解析和原理及区别_高端功率 mos 管是什么意思-CSDN博客 PMOS管&#xff1a; PMOS管的源极&#xff08;Source&#xff09;通常连接到正电源&#xff08;Vcc&#…

西门子学习笔记15 - 位逻辑操作的学习

1、点动操作&#xff08;按下按钮就启动松开就停止&#xff09; 2、自锁电路&#xff08;可以自己保持的状态除非常闭停止按下&#xff09; 3、取反操作&#xff08;顾名思义就是反过来1就变成0&#xff0c;0就变成1&#xff09; 4、置为复位&#xff08;置位之后如果不复位的话…

SpringBoot自定义Starter及原理分析

目录 1.前言2.环境3.准备Starter项目4.准备AutoConfigure项目4.1 准备类HelloProperties4.2 准备类HelloService4.3 准备类HelloServiceAutoConfiguration4.4 创建spring.factories文件并引用配置类HelloServiceAutoConfiguration4.5 安装到maven仓库 5.在其他项目中引入自定义…

困惑度作为nlp指标的理解示例

为了更清晰地说明困惑度的计算过程以及如何通过困惑度判断模型的优劣&#xff0c;我们可以通过一个简单的例子来演示。假设我们有一个非常简单的文本语料库和两个基础的语言模型进行比较。 示例文本 假设我们的文本数据包括以下两个句子&#xff1a; “cat sits on the mat”…

计算机网络:网络层 - 路由选择协议

计算机网络&#xff1a;网络层 - 路由选择协议 路由器的结构路由选择协议概述自治系统 AS内部网关协议路由信息协议 RIP距离向量算法RIP报文格式收敛问题 开放最短路径优先 OSPF基本工作原理自治系统分区 外部网关协议BGP-4 路由器的结构 如图所示&#xff0c;路由器被分为路由…

【项目实战】如何写一个操作系统?

【项目实战】如何写一个操作系统? 目录 【项目实战】如何写一个操作系统?前言下载32位的lucid系统解决旧版系统下载源失效的问题利用共享文件夹将下载的.deb文件上传系统中如何解决下载了g但是不能使用的问题&#xff1f;编译系统源文件配置grub和qemu项目拓展 作者&#xff…

证照之星 XE版软件怎么下载安装? 【详细安装图文教程】

软件简介&#xff1a; 证照之星是国内顶级的证件照片制作软件&#xff0c;具有一键裁剪&#xff0c; 智能背景替换&#xff0c;批量制作、内置证照规格的四大优势。同时两大独创技术&#xff1a;智能去除皮肤油光、证照服装替换。同时支持联机拍摄&#xff1a;支持网络摄像头及…

【软件工程】【23.04】p2

关键字&#xff1a; 计算机软件定义、需求基本性质、创建系统类图所涉及的工作、RUP创建系统用况模型活动、软件生存周期模型、能力等级和成熟度等级区别联系&#xff1b; 模块结构图&#xff1a;深度宽度、扇入扇出、作用域、控制域&#xff1b; 程序流程图&#xff1a;语句…

吉他谱反复记号有哪些 Guitar Pro如何加吩咐标记 吉他初学者入门教程

吉他谱中的反复记号是指用来指示音乐重复部分的符号&#xff0c;对于吉他演奏者来说&#xff0c;了解这些符号的含义和使用方法非常重要。下面我们来看看吉他谱反复记号有哪些&#xff0c;Guitar Pro 如何加吩咐标记的相关内容。 一、吉他谱反复记号有哪些 1.双线反复记号&am…

大数据与人工智能在保险行业数字化转型中的应用

随着科技的快速发展&#xff0c;大数据和人工智能&#xff08;AI&#xff09;技术在保险行业中扮演着越来越重要的角色&#xff0c;推动了保险行业的数字化转型。通过收集和分析海量的用户数据&#xff0c;利用先进的人工智能算法&#xff0c;保险公司能够更准确地评估风险&…

数据交换平台_10_activatemq 中间件容错性测试

目录概要 3. 容错测试: - 模拟ActiveMQ在异常情况下的表现,如网络中断、节点故障等。 - 观察ActiveMQ的容错机制是否能够正确处理异常情况,保证消息的可靠传输。 - 根据容错测试结果,优化ActiveMQ的容错机制,确保系统在面对异常情况时能够正确处理并恢复。 设计: 容错测…

操作系统—页表(实验)

文章目录 页表1.实验目标2.实验过程记录(1).增加打印页表函数(2).独立内核页表(3).简化软件模拟地址翻译 3.实验问题及相应解答问题1问题2问题3问题4 实验小结 页表 1.实验目标 了解xv6内核当中页表的实现原理&#xff0c;修改页表&#xff0c;使内核更方便地进行用户虚拟地址…

华媒舍:明星祝福视频,为你送上最真挚的祝福!

引言&#xff1a;嗨&#xff0c;亲爱哒书友&#xff01;在这样一个科谱详细介绍文中&#xff0c;我们将带你领略一份尤其的独家合辑——十部明星祝愿视频。这种视频汇聚了诸多明星为你送上的最真挚的祝福。让我们一起来探寻这种电影中蕴含的情绪和价值吧&#xff01; 1.共享温暖…

【JS重点16】对象原型

目录 一&#xff1a;对象原型是什么 二&#xff1a;对象原型作用 三&#xff1a;constructor属性 四&#xff1a;如何赚钱 一&#xff1a;对象原型是什么 每个对象都有一个属性__proto__(称为原型对象),该属性是一个对象 __proto__是JS非标准属性在实例对象中&#xff0c;…

MongoDB~高可用集群介绍:复制集群(副本集)、分片集群

背景 MongoDB 的集群主要包括副本集&#xff08;Replica Set&#xff09;和分片集群&#xff08;Sharded Cluster&#xff09;两种类型。 副本集 组成&#xff1a;通常由一个主节点&#xff08;Primary&#xff09;和多个从节点&#xff08;Secondary&#xff09;构成。 功…

Linux 按键输入实验

Linux 按键输入实验 1、添加 pinctrl 节点 首先修改在设备树里面添加关于按键的节点。I.MX6U-ALPHA 开发板上的 KEY 使用了 UART1_CTS_B 这个 PIN&#xff0c;打开 imx6ull-alientekemmc.dts&#xff0c;在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_key”的子…

深度学习 --- stanford cs231 编程作业(assignment1,Q3: softmax classifier)

stanford cs231 编程作业(assignment1&#xff0c;Q3: softmax classifier softmax classifier和svm classifier的assignment绝大多部分都是重复的&#xff0c;这里只捡几个重点。 1&#xff0c;softmax_loss_naive函数&#xff0c;尤其是dW部分 1&#xff0c;1 正向传递 第i张…