解码Linux中的Shell:一探脚本起源、发展与变量数据类型之奥秘

🐇明明跟你说过:个人主页

🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅

🔖行路有良友,便是天堂🔖

目录

一、前言

1、Linux的起源与发展

2、什么是Shell脚本

3、Shell脚本的应用场景

二、Shell脚本基础

1、Shell的种类及其特点

2、Shell脚本的创建与执行过程 

3、Shell脚本中的注释 

三、变量与数据类型

1、变量的定义与使用

2、变量的分类(局部变量、环境变量等) 

3、数据类型(字符串、数字、数组等) 

4、变量的运算与操作 


一、前言

1、Linux的起源与发展


1991年,芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)开始编写一个新的操作系统内核,这个内核最初被称为“Freax”。他的初衷只是想学习操作系统内核的开发,并为自己的个人计算机编写一个操作系统。然而,当他将这个内核发布在Internet上并开放源代码后,全球各地的程序员开始参与到这个项目中来,共同完善这个内核。最终,这个内核被命名为Linux,这个名字是由Linus Torvalds的名字和Unix操作系统的名字组合而成的。

Linux从一开始就坚持源代码的公开和免费使用,任何人都可以对其进行修改和分发。这种开放性和自由性吸引了大量的开发者和用户,使得Linux逐渐成长并成熟起来。如今,Linux已经发展成为一个性能稳定、功能强大的多用户网络操作系统,支持32位和64位硬件,能运行主要的Unix工具软件、应用程序和网络协议。同时,Linux也有上百种不同的发行版,如基于社区开发的Debian、ArchLinux,以及基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。

2、什么是Shell脚本

Shell 脚本是一种用来编写一系列命令以自动执行特定任务的文本文件。它们由命令、控制结构、变量和函数组成,通常用于在 Unix 或类 Unix 操作系统(如 Linux)上执行系统管理任务、自动化任务或其他常见任务。Shell 脚本可以通过命令行解释器(如 Bash、sh、zsh 等)来执行,并且可以包含条件判断、循环、函数定义等高级功能。

Shell 脚本通常以 .sh 为扩展名,并且可以包含各种命令,包括系统命令、应用程序命令和其他脚本命令。通过组织和编写这些命令,可以创建一个可以自动执行特定任务的脚本。Shell 脚本在自动化系统管理、批处理任务、日常任务以及编写复杂的系统管理脚本方面非常有用。

3、Shell脚本的应用场景

  1. 系统管理和自动化任务:Shell 脚本可以用来管理和自动化 Unix/Linux 系统上的各种任务,如系统配置、日志管理、备份和恢复、定时任务等。
  2. 软件部署和配置:通过编写 Shell 脚本可以实现软件的自动化部署和配置,包括安装软件、设置环境变量、配置文件等。
  3. 数据处理和分析:Shell 脚本可以用于对文本文件、日志文件和数据文件进行处理和分析,包括提取、过滤、转换、统计等操作。
  4. 任务调度和定时执行:通过 Shell 脚本可以实现定时任务的调度和执行,例如每天备份数据库、定时清理日志文件等。
  5. 系统监控和报警:Shell 脚本可以用于编写监控脚本,定期检查系统状态、服务运行情况等,并在异常情况下发送报警通知。
  6. 网络管理和安全:Shell 脚本可以用于网络管理和安全方面的任务,如配置防火墙、监控网络流量、检测安全漏洞等。
  7. 自动化测试和持续集成:Shell 脚本可以用于自动化测试和持续集成流程中的各种任务,如构建、测试、部署等。
  8. 日常任务和工作流程:Shell 脚本可以用于简化日常工作流程和任务,提高工作效率,例如自动化文档生成、邮件发送等。

总的来说,Shell 脚本是一种非常灵活和强大的工具,可以帮助用户简化和自动化各种任务,提高工作效率,减少人为错误,是 Unix/Linux 系统中不可或缺的重要组成部分。

二、Shell脚本基础

1、Shell的种类及其特点

1. Bourne Shell (sh):

  • Bourne Shell 是 Unix 系统中最早的 Shell,由 Stephen Bourne 开发。
  • 具有简洁、高效的特点,适合编写简单的脚本。
  • 通常作为标准 Shell 的基准,其他 Shell 往往与其兼容。

2. Bourne-Again Shell (bash):

  • Bourne-Again Shell 是 Bourne Shell 的增强版本,也是 Linux 系统默认的 Shell。
  • 具有命令行编辑、命令历史、自动补全等功能,易用性更好。
  • 支持丰富的内置命令和扩展特性,是使用最广泛的 Shell 之一。

3. C Shell (csh):

  • C Shell 是由 Bill Joy 开发的 Unix Shell,语法类似于 C 语言。
  • 具有 C 语言风格的控制结构和语法,适合程序员和开发人员使用。
  • 支持命令别名、历史记录、作业控制等功能。

4. Korn Shell (ksh):

  • Korn Shell 是由 David Korn 开发的 Unix Shell,综合了 Bourne Shell 和 C Shell 的特点。
  • 具有强大的脚本编程能力和丰富的内置命令,性能较好。
  • 提供了很多扩展特性,包括数组、算术运算、通配符扩展等。

5. Z Shell (zsh):

  • Z Shell 是对 Bourne Shell 的扩展和改进,具有高度的可定制性和用户友好性。
  • 支持更丰富的命令补全、拼写检查、主题和插件等功能。
  • 适合于需要大量定制和配置的用户,如系统管理员和开发人员。

使用最广泛的是Bourne-Again Shell,但每种类型的 Shell 都有其特定的应用场景和优势,可以根据自己的需求和偏好选择合适的 Shell 进行使用。 

2、Shell脚本的创建与执行过程 

创建和执行 Shell 脚本的过程通常包括以下步骤:

1. 创建 Shell 脚本文件:

chmod +x myscript.sh
  • 使用文本编辑器(如 Vim、Emacs、Nano 等)创建一个新的文本文件,并将其命名为带有 .sh 扩展名的文件名,例如 myscript.sh。

2. 添加 Shell 脚本内容:

  • 在创建的 Shell 脚本文件中编写 Shell 脚本内容。Shell 脚本可以包含一系列 Shell 命令、控制结构(如 if、for、while)、函数定义等。

3. 设置执行权限:

  • 在终端中使用 chmod 命令为 Shell 脚本文件添加执行权限。例如,可以运行以下命令将文件 myscript.sh 设置为可执行:


4. 执行 Shell 脚本:

  • 可以通过终端中直接运行 Shell 脚本文件来执行它。例如,假设脚本文件位于当前目录下,可以使用以下命令执行脚本:
./myscript.sh


5. 脚本输出:

  • Shell 脚本执行后,会根据脚本中的命令产生输出。输出可以是在终端上显示的文本消息,也可以是写入文件、传递给其他命令等形式。

6. 调试和修改:

  • 如果脚本执行出现问题或需要调整脚本行为,可以通过编辑脚本文件并再次执行来进行调试和修改。通常可以添加调试信息、修改命令参数、调整控制结构等来解决问题和改进脚本功能。

以上是创建和执行 Shell 脚本的基本步骤,通过这些步骤可以编写并运行自己的 Shell 脚本来自动化各种任务和操作。

 

3、Shell脚本中的注释 

在 Shell 脚本中,注释是用来添加说明和文档的重要工具。注释可以帮助他人理解脚本的功能和逻辑,也可以帮助自己在未来回顾和修改脚本时更容易理解。

在 Shell 脚本中,有两种常见的注释方式:

1. 单行注释:以 # 符号开头,表示从该符号到行尾的内容都是注释,不会被解释执行。

# 这是一个单行注释,用于说明该命令的作用
command1  # 这也是一个单行注释,用于说明命令的作用


2. 多行注释:在大多数 Shell 中,并没有直接的多行注释语法,但可以使用多个单行注释来模拟多行注释的效果。

# 这是一个多行注释
# 可以在这里添加多行注释的内容
# 这些内容不会被执行


在编写 Shell 脚本时,良好的注释习惯是非常重要的。合适的注释可以提高脚本的可读性和可维护性,使得他人更容易理解脚本的用途和实现方式,也方便自己在日后修改和维护脚本。

三、变量与数据类型

1、变量的定义与使用

在 Shell 脚本中,变量是用来存储数据的容器,可以是数字、字符串、数组等。定义变量时,不需要指定数据类型,Shell 会根据赋值自动确定数据类型。变量的使用可以帮助简化脚本的编写,并提高代码的可读性和可维护性。

以下是在 Shell 脚本中定义和使用变量的示例:

1. 定义变量:

# 定义一个字符串变量
name="John"
# 定义一个整数变量
age=30
# 定义一个数组变量
fruits=("apple" "banana" "orange")


2. 使用变量:

# 使用变量的值输出到屏幕
echo "Name: $name"
echo "Age: $age"
echo "Fruits: ${fruits[0]}, ${fruits[1]}, ${fruits[2]}"


在使用变量时,需要在变量名前加上 $ 符号来引用变量的值。如果变量名后面有大括号 {},则变量名与后面的字符明确分隔开,避免歧义。例如,在拼接字符串或数组元素时,推荐使用 ${variable} 的形式。

此外,Shell 还提供了一些特殊变量,例如 $0 表示脚本本身的文件名,$1, $2, $3, ... 表示传递给脚本的参数,$# 表示传递给脚本的参数个数,$@ 表示传递给脚本的所有参数的列表等。

2、变量的分类(局部变量、环境变量等) 

在 Shell 脚本中,变量可以根据其作用域和生命周期的不同进行分类,常见的分类包括:

1. 局部变量(Local Variables):

  • 局部变量定义在函数内部或脚本的某个代码块内部。
  • 它们的作用范围仅限于定义它们的代码块内部,超出该范围无法访问。
  • 在函数执行完毕或代码块结束后,局部变量的值将被销毁。

2. 环境变量(Environment Variables):

  • 环境变量是在操作系统级别定义的,可以被所有进程访问。
  • 在 Shell 中,通过 export 命令可以将局部变量导出为环境变量,使其在当前 Shell 会话中可用。
  • 环境变量通常用于存储系统配置信息、路径、用户信息等。

3. 全局变量(Global Variables):

  • 全局变量的作用域在整个脚本中都是可见的。
  • 它们可以在脚本的任何地方被定义,并且在整个脚本中都可以被访问和修改。
  • 在 Shell 脚本中,通常不会显式地声明全局变量,而是通过在函数内部使用 local 关键字来定义局部变量,而在函数外部定义的变量默认为全局变量。

4. 特殊变量(Special Variables):

  • 特殊变量是由 Shell 内部预先定义的,用于表示特定的信息或参数。
  • 例如,$0 表示脚本的名称,$1, $2, $3, ... 表示传递给脚本的参数,$# 表示参数个数,$? 表示上一个命令的退出状态等。

根据变量的作用范围和生命周期的不同,可以将变量分为局部变量、环境变量、全局变量和特殊变量。在编写 Shell 脚本时,根据需要选择合适的变量类型来存储和管理数据。

3、数据类型(字符串、数字、数组等) 

在 Shell 脚本中,变量的数据类型相对简单,主要包括以下几种:

1. 字符串(String):

  • 字符串是 Shell 中最常见的数据类型,可以包含任意字符序列,包括字母、数字、特殊字符等。
  • 字符串可以用单引号 ' ' 或双引号 " " 包裹,其中单引号内的字符串将被视为原样输出,而双引号内的字符串支持变量替换和转义字符。
  • 例如:name="John"、message='Hello, World!'

2. 数字(Number):

  • Shell 中的数字通常以字符串的形式存在,但可以进行数学运算。
  • 对于整数计算,可以直接进行加减乘除等数学运算,不需要额外的类型转换。
  • 例如:count=10、result=$((5 + 3))

3. 数组(Array):

  • Shell 支持一维数组,用于存储多个值。
  • 数组的元素可以是任意类型的数据,包括字符串和数字。
  • 数组的索引从 0 开始。
  • 数组的定义和赋值方式如下:
fruits=("apple" "banana" "orange")
numbers=(10 20 30)

  • 访问数组元素的方式如下:
echo ${fruits[0]}   # 输出数组 fruits 的第一个元素
echo ${numbers[@]}   # 输出数组 numbers 的所有元素


4. 关联数组(Associative Array):

  • 关联数组是一种特殊的数组,其索引不再必须是数字,而可以是字符串。
  • 关联数组的定义和赋值方式如下:
declare -A colors
colors["red"]="#FF0000"
colors["green"]="#00FF00"
colors["blue"]="#0000FF"

  • 访问关联数组元素的方式如下:
echo ${colors["red"]}   # 输出关联数组 colors 的 "red" 元素的值


在 Shell 脚本中,变量的数据类型相对简单且灵活,开发者可以根据需要选择合适的数据类型来存储和处理数据。

4、变量的运算与操作 


在 Shell 脚本中,可以进行各种类型的变量运算和操作,包括数学运算、字符串操作、数组操作等。以下是一些常见的变量运算和操作:

1. 数学运算:

  • Shell 可以进行基本的数学运算,包括加减乘除、求余等。
  • 使用 $((...)) 或 expr 命令来执行数学运算。
  • 例如:
num1=10
num2=5
sum=$((num1 + num2))      # 加法
difference=$((num1 - num2))   # 减法
product=$((num1 * num2))   # 乘法
quotient=$((num1 / num2))   # 除法
remainder=$((num1 % num2))   # 求余


2. 字符串操作:

  • 可以对字符串变量进行拼接、截取、查找等操作。
  • 例如:
str1="Hello"
str2="World"
result="$str1 $str2"   # 字符串拼接
substring=${str1:0:3}   # 字符串截取,获取从第 0 个字符开始的 3 个字符
index=${str1/ll/L}   # 字符串替换,将第一次出现的 "ll" 替换为 "L"


3. 数组操作:

  • 对数组进行元素的添加、删除、查找等操作。
  • 例如:
fruits=("apple" "banana" "orange")
fruits+=("grape")   # 添加元素到数组末尾
unset fruits[1]   # 删除数组中的第二个元素
echo ${fruits[@]}   # 输出数组的所有元素


4. 变量操作:

  • 可以获取变量的长度、检查是否为空等操作。
  • 例如:
str="Hello, World!"
length=${#str}   # 获取字符串长度
is_empty=${str:-"default"}   # 如果字符串为空,则使用默认值


这些变量运算和操作可以帮助 Shell 脚本实现丰富的功能,提高脚本的灵活性和可用性。

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Linux的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL面试——聚簇/非聚簇索引

存储引擎是针对表结构,不是数据库 引擎层:对数据层以何种方式进行组织 update:加索引:行级锁;不加索引:表级锁

LabVIEW专栏七、队列

目录 一、队列范例二、命令簇三、队列应用1.1、并行循环队列1.2、命名队列和匿名队列1.2.1、命名队列1.2.2、匿名队列 1.3、长度为1的队列 队列是一种特殊的线性表,就是队列里的元素都是按照顺序进出。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为…

HNCTF 2022 week1 题解

自由才是生活主旋律。 [HNCTF 2022 Week1] Interesting_include <?php //WEB手要懂得搜索 //flag in ./flag.phpif(isset($_GET[filter])){$file $_GET[filter];if(!preg_match("/flag/i", $file)){die("error");}include($file); }else{highlight_…

OSPF的协议特性

路由汇总的概念 l 路由汇总&#xff08; Route Aggregation &#xff09;&#xff0c;又称路由聚合&#xff08;Route Summarization&#xff09;&#xff0c;指的是把一组明细路由汇聚成一条汇总路由条目的操作 l 路由汇总能够减少路由条目数量、减小路由表规模&#xff0…

目标检测——3D玩具数据集

在数字化时代&#xff0c;计算机视觉技术取得了长足的进展&#xff0c;其中基于形状的3D物体识别技术更是引起了广泛关注。该技术不仅有助于提升计算机对现实世界物体的感知能力&#xff0c;还在多个领域展现出了广阔的应用前景。本文将探讨基于形状的3D物体识别实验的重要性意…

STM32的Flash读写保护

参考链接 STM32的Flash读写保护&#xff0c;SWD引脚锁的各种解决办法汇总&#xff08;2020-03-10&#xff09;-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1597959 STM32系列芯片Flash解除写保护的办法 - 知乎 (zhihu.com)https://zh…

Java设计模式:使用责任链模式和状态模式优化‘审批流程‘

Java设计模式&#xff1a;使用责任链模式和状态模式优化审批流程 摘要引言 需求流程图正文内容&#x1f4d0; 基本概念介绍 功能实现示例1:设计模式&#xff1a;责任链模式方法&#xff1a;好处&#xff1a; 示例2:设计模式&#xff1a;责任链模式方法和操作流程&#xff1a;好…

mongodb 分片集群认证

增加认证 副本间认证外部使用认证 如果是开启状态,先关闭路由,再关闭配置服务,最后关闭分片数据复本集中的每个mongod&#xff0c;从次节点开始。直到副本集的所 有成员都离线&#xff0c;包括任何仲裁者。主节点必须是最后一个成员关闭以避免潜在的回滚.最好通过 db.shutdow…

Spring Bean 的生命周期与作用域解析及实战

引言 在Spring框架中&#xff0c;Bean是构成应用的核心组件&#xff0c;它们负责执行应用中的业务逻辑。理解Spring Bean的生命周期和作用域对于开发高效、稳定的Spring应用至关重要。本文将详细解析Spring Bean的生命周期和作用域&#xff0c;并通过实战案例加深理解。 一、…

人工智能好多人都在用,那么用户画像要怎么看?

用户画像是通过对用户行为、偏好、兴趣等数据进行分析和整理&#xff0c;从而形成的关于特定用户群体的描述和模型。在人工智能应用中&#xff0c;用户画像可以起到指导个性化推荐、精准营销、产品设计等方面的作用。以下是用户画像在人工智能应用中的几个重要方面&#xff1a;…

网站被SmartScreen标记为不安全怎么办?

在互联网时代&#xff0c;网站的安全性和可信度是用户选择是否继续访问的重要因素之一&#xff0c;然而&#xff0c;网站运营者偶尔会发现使用Edge浏览器访问网站时&#xff0c;会出现Microsoft Defender SmartScreen&#xff08;以下简称SmartScreen&#xff09;提示网站不安全…

上位机图像处理和嵌入式模块部署(树莓派4b之mcu固件升级)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在一个系统当中&#xff0c;可能不止需要树莓派4b一个设备&#xff0c;有的时候还需要搭载一个mcu&#xff0c;做一些运动控制的事情。比如说&…

SRAM控制原理与读写实例

本文对SRAM进行介绍&#xff0c;并对其内部的存储器矩阵、地址译码器、列I/O及I/O数据电路、控制电路、SRAM的读写流程进行简要介绍&#xff0c;并给出SRAM IS62LV256-45U读写实例。 文章目录 存储容量的计算SRAM控制原理SRAM信号线存储器矩阵地址译码器、列I/O及I/O数据电路控…

陆游只爱前妻唐婉,深情大渣男太虐了

陆游和唐婉的感情太好了&#xff0c;经常写诗逗乐。陆游科举考不上&#xff0c;沉迷儿女情长&#xff0c;被母亲拆散。 秦侩当政&#xff0c;就是害死岳飞的那个秦桧。陆游第二次考进士&#xff0c;被秦侩批复“喜论恢复”&#xff0c;没考上。陆游的母亲生气&#xff0c;找个…

计算机视觉——两视图几何求解投影矩阵

上文我提到了通过图像匹配得到基本矩阵&#xff0c;接下来我们要接着求解投影矩阵。 计算投影矩阵思路 假设两个投影矩阵为规范化相机&#xff0c;因此采用基本矩阵进行恢复。在规范化相机下&#xff0c; P [ I ∣ 0 ] P[I|0] P[I∣0], P ′ [ M ∣ m ] P[M|m] P′[M∣m]。…

【Webgl_glslThreejs】搬运分享shader_飘落心形

来源网站 https://www.shadertoy.com/view/4sccWr效果预览 代码演示 将shadertory上的代码转成了threejs可以直接用的代码&#xff0c;引入文件的material&#xff0c;并在创建mesh或已有物体上使用material即可&#xff0c;使用时请注意uv对齐。 import { DoubleSide, Shad…

视频中为什么需要这么多的颜色空间?

在视频处理中&#xff0c;经常会用到不同色彩空间&#xff1a;非线性RGB&#xff0c;线性 RGB&#xff0c;YUV&#xff0c;XYZ……为什么需要这么多的色彩空间呢&#xff1f; 1、视频采集时的线性RGB颜色空间 由数码相机中的 CMOS 传感器产生并写入原始文件&#xff08;Raw Fil…

深度学习检测算法YOLOv5的实战应用

在当前的检测项目中&#xff0c;需要一个高效且准确的算法来处理大量的图像数据。经过一番研究和比较&#xff0c;初步选择了YOLOv5作为算法工具。YOLOv5是一个基于深度学习的检测算法&#xff0c;以其快速和准确而闻名。它不仅能够快速处理图像数据&#xff0c;还能提供较高的…

区块链技术与应用学习笔记(12-13节)——北大肖臻课程

目录 12.BTC-匿名性 一、什么是匿名&#xff1f; 1&#xff0c;有可能破坏比特币匿名性的两个方面 2&#xff0c;如何提高匿名性 一个比特币用户能采用什么样的方法尽量提高个人的匿名性? 分解&#xff1a; 1、网络层怎么提高匿名性? 2、应用层怎么提高匿名性? 零知…

揭露 FileSystem 引起的线上 JVM 内存溢出问题

作者&#xff1a;来自 vivo 互联网大数据团队-Ye Jidong 本文主要介绍了由FileSystem类引起的一次线上内存泄漏导致内存溢出的问题分析解决全过程。 内存泄漏定义&#xff08;memory leak&#xff09;&#xff1a;一个不再被程序使用的对象或变量还在内存中占有存储空间&#x…