Shell脚本基础(1):初识脚本及变量使用

内容预览 ≧∀≦ゞ

  • Shell脚本基础(1):初识脚本及变量使用
    • 声明
    • 一、Shell 基础知识
      • Shell的基本概念
      • 常见Shell类型
      • Shell脚本的特点
      • Shell脚本的基本语法
    • 二、创建和运行 Shell 脚本
      • 第一步:创建 Shell 脚本
      • 第二步:赋予执行权限
      • 第三步:运行 Shell 脚本
      • 第四步:其他运行方式
    • 三、变量的使用
      • 1. 变量声明和定义
      • 2. 组合多个变量
      • 3. 引号的使用
        • 双引号 (`" "`)
        • 单引号 (`' '`)
        • 大括号 (`{}`)
        • 不加引号的情况
      • 4. 删除变量
      • 5. 变量命名规则
    • 小结

Shell脚本基础(1):初识脚本及变量使用


声明

本笔记参考了B站UP主 泷羽sec 的学习视频,若内容涉及侵权,将立即删除。
本笔记旨在促进网络安全学习,任何不当使用与作者无关,请勿逾越法律红线,否则后果自负。
希望这些内容能对各位师傅有所帮助,欢迎点赞和评论!


一、Shell 基础知识

Shell的基本概念

  • 定义
    Shell 是操作系统中的命令解释器,位于用户与操作系统内核之间。它接收并解释用户输入的命令,将任务传递给操作系统内核执行,然后将执行结果返回给用户。Shell 使得用户能够通过命令行与操作系统交互,控制和管理计算机的各种资源和应用。Shell 是系统与用户之间的桥梁,通过 Shell,用户可以直接控制操作系统进行文件操作、程序执行、系统配置等。

  • Shell 脚本
    Shell 脚本是由一系列 Shell 命令组成的文件,可以自动执行任务,通常用于简化和自动化操作。Shell 脚本是一种解释型语言,不需要编译,它会逐行解释并执行脚本中的命令。通过编写 Shell 脚本,用户可以在多个操作系统中执行相同的任务,而无需手动输入每一条命令。

  • Shell 脚本的主要用途

    • 自动化任务:通过编写 Shell 脚本,用户可以自动执行重复性的任务,如文件备份、日志分析、定时任务等。
    • 批量文件管理:Shell 脚本可以处理大量文件的管理任务,如批量重命名、移动、删除或修改文件内容等。
    • 系统命令执行:系统管理员常常使用 Shell 脚本执行操作系统命令,如安装软件包、配置系统设置、管理用户权限等。
    • 程序调度:Shell 脚本可与任务调度程序(如 cron)结合,定期执行特定任务,例如定时备份、数据清理等。
    • 网络服务管理:Shell 脚本广泛用于配置和管理网络服务,例如启动和停止 Web 服务器、数据库服务器等。

常见Shell类型

  • /bin/sh:传统的Shell,最早由Steve Bourne在1970年代开发,因此也称为 Bourne Shell。许多脚本使用 /bin/sh 作为默认的Shell解释器。在现代Linux系统中,/bin/sh 通常是指向其他Shell(如 bashdash)的符号链接。

  • /bin/bash:Bash(Bourne Again Shell)是Linux中最常用的Shell,它是Bourne Shell的增强版本,增加了更多的功能和灵活性,比如命令补全、历史命令、数组支持等。几乎所有Linux用户都在使用Bash作为默认Shell。

  • /bin/dash:Dash(Debian Almquist Shell)是一个轻量级、高效的Shell,常用于需要快速启动和执行脚本的场景,特别是在Debian及其衍生发行版中。与 bash 相比,dash 提供的功能较少,但它遵循POSIX标准并执行速度更快,因此被许多系统(如Ubuntu)选择作为 /bin/sh 的实现。dash 适用于那些没有依赖 bash 特有功能的脚本,并且在执行效率上有优势。

  • /sbin/nologin/usr/sbin/nologin:这两者并不是Shell,而是一个特殊的程序,用于阻止某些用户通过Shell登录系统。通常,系统管理员或受限账户(例如服务账户)会被配置为使用这类Shell,以防止他们直接访问系统。这些Shell会向用户显示一条“登录已禁用”的消息,并拒绝任何登录尝试。

Shell脚本的特点

  1. 解释型语言:Shell 脚本属于解释型语言,不需要事先编译。Shell 解释器会逐行解析并执行脚本中的命令,适合快速开发和调试,尤其是在系统管理和自动化任务中。
  2. 交互性:Shell 提供了交互式命令行界面,支持用户在运行脚本时与其交互。用户可以在脚本执行过程中提供输入,根据输入的内容,脚本可以执行不同的操作。
  3. 灵活性:Shell脚本支持多种命令类型,包括内置命令、外部命令、以及通过脚本自定义的命令。通过控制结构(如条件语句、循环语句等),Shell脚本能够执行复杂的逻辑和任务。
  4. 可移植性:大多数 Shell 脚本可以在不同的操作系统和Shell解释器上运行。虽然有些Shell具有特定的功能,Shell脚本在不同系统上的兼容性通常较好,可以帮助开发人员实现跨平台自动化任务。

Shell脚本的基本语法

  • 变量

    • 定义与使用:Shell脚本支持使用变量来存储数据(如字符串、数值等),并可以在脚本中随时调用。例如,使用 name="xiaoyu" 定义一个变量 name,然后通过 $name${name} 引用该变量。
    • 预定义变量:Shell 提供了一些内置的预定义变量,如 $HOME(用户的主目录),$PATH(可执行文件路径),$USER(当前用户名)等。
    • 环境变量与位置变量:环境变量是影响Shell环境的全局变量,位置变量则是通过脚本参数传递的变量(如 $1, $2, "$@"等)。
  • 运算符

    • 算术运算符:Shell支持基本的数学运算,如加法(+)、减法(-)、乘法(*)、除法(/)等,使用 (( ))let 来进行数值计算。
    • 逻辑运算符:Shell支持常见的逻辑运算符,如与(&&)、或(||)、非(!)等,用于控制流程和判断条件。
    • 字符串运算符:例如字符串的拼接、长度获取(${#var})、子串提取(${var:position:length})等操作。
  • 控制结构

    • 条件语句:Shell支持 if-else 语句、case 语句等,用于根据不同的条件执行不同的操作。例如,if [ condition ]; then ... fi 用于根据条件判断执行特定命令。
    • 循环语句:Shell支持 for 循环(用于遍历列表)、while 循环(基于条件判断执行)、until 循环(直到条件为真时停止)等。可以使用这些语句进行重复任务处理。
    • 跳转语句:如 break(跳出循环)、continue(跳过当前循环)等,便于控制脚本执行流程。
  • 函数

    • Shell 脚本支持函数的定义和调用,函数使得脚本更具模块化和可维护性。函数可以接收参数、执行特定任务并返回结果。例如,定义一个简单的函数:
    function greet() {echo "Hello, $1"
    }
    greet "World"
    

    该函数将打印 "Hello, World"。通过使用函数,用户可以将常用的代码封装成模块,便于重复使用和管理。


二、创建和运行 Shell 脚本

第一步:创建 Shell 脚本

在 Kali Linux 系统中,首先打开终端并创建一个名为 1.sh 的文件。可以使用 vim 编辑器来创建并编辑文件:

vim 1.sh

在文件中加入以下内容:

#!/bin/bash
echo "Hello, World!"
  • #!/bin/bash:这是脚本的shebang,它指定了该脚本的解释器。/bin/bash 是常见的默认Shell解释器,可以根据需要更改为其他类型的Shell(如 /bin/sh/bin/dash 等),但通常这会调用 dash 作为默认解释器。

编辑完成后,按 ESC 键退出编辑模式,输入 :wq 保存并退出 vim 编辑器。

第二步:赋予执行权限

为了能够执行该脚本,我们需要给它赋予执行权限。使用以下命令:

chmod u+x 1.sh
  • chmod u+x 1.sh:这条命令为 1.sh 文件的所有者(user)添加执行权限。执行权限是运行脚本所必需的。如果没有赋予执行权限,会遇到 “权限不足” 错误。

第三步:运行 Shell 脚本

现在,你可以运行脚本了。使用以下命令执行脚本:

./1.sh

此时,终端将输出:

Hello, World!
  • ./:表示在当前目录下执行文件。如果没有加 ./,Shell 将无法找到文件并执行,除非该目录包含在系统的 PATH 环境变量中。

第四步:其他运行方式

除了直接使用 ./ 执行脚本,还可以使用其他方法:

  1. 使用 sh 命令执行

    如果不想给脚本赋予执行权限,可以使用 sh 命令来运行脚本:

    sh 1.sh
    

    这种方法不会要求文件具备执行权限,sh 会自动解析并执行脚本中的命令。它会启动一个新的Shell进程来执行脚本,且与直接使用 ./ 执行脚本相比,存在一些行为上的差异。比如,脚本的环境变量不会直接影响到当前Shell环境。

  2. 使用 source. 命令执行

    source 命令或点命令(.)也可以用来执行脚本,并且它们的执行方式与 sh./ 命令不同。它们会在当前的 Shell 环境中执行脚本,而不是创建一个新的子 Shell。换句话说,执行脚本时,脚本中的变量、函数等会直接影响到当前的Shell环境。

    source 1.sh
    # 或者
    . 1.sh
    

    使用 source. 命令时,Shell 会立即执行脚本内容并将脚本中的所有设置(例如变量、函数等)保留在当前的Shell环境中。这样可以影响当前Shell的状态,例如你修改了当前Shell的环境变量或路径,它会立即生效。

➤ 区别:

  • source / . 执行方式:在当前Shell环境中执行脚本,脚本中的命令直接影响当前Shell的状态,且可以保持交互式Shell的特性(例如命令高亮、历史记录等)。

  • sh / ./ 执行方式:通过新启动一个子Shell来执行脚本,命令不会影响当前Shell环境,且通常不会保留交互式Shell的高亮等特性。


三、变量的使用

Shell 脚本中的变量是非常常见且强大的工具,掌握变量的使用能够让脚本更加灵活、易于管理并提高可维护性。

1. 变量声明和定义

在 Shell 中,变量声明和赋值非常简洁:

name="xiaoyu"
  • name="xiaoyu":定义了一个变量 name,并将其值设置为 “xiaoyu”。Shell 中不需要指定变量的类型,变量是动态类型的,值的类型会根据其内容自动确定。
  • $name:用来引用变量 name 的值。

然后,你可以使用 echo 命令来输出变量的值:

echo $name

输出结果:

xiaoyu

2. 组合多个变量

Shell 允许你将多个变量组合在一起,生成更复杂的字符串或进行动态输出:

age=27
echo "My name is $name, and my age is $age years old."

输出结果:

My name is xiaoyu, and my age is 27 years old.

3. 引号的使用

引号在 Shell 中具有特殊意义,决定了如何解析其中的内容,特别是在涉及变量时。根据引号的不同类型,Shell 会以不同的方式处理变量的内容。

双引号 (" ")

双引号内的内容会被 Shell 解释,变量会被替换为它们的实际值。在大多数情况下,我们推荐使用双引号来引用变量,尤其是在变量值中包含空格或特殊字符时。

echo "My name is $name, and my age is $age years old."

输出结果:

My name is xiaoyu, and my age is 27 years old.

如果变量值包含空格或其他特殊字符,使用双引号能够确保变量的值被正确解析:

full_name="John Doe"
echo "My full name is $full_name."

输出结果:

My full name is John Doe.
单引号 (' ')

单引号内的内容会被完全当作字符串处理,Shell 不会对其中的内容进行变量替换或转义处理。因此,单引号适用于你不希望变量被解析的情况。

echo 'My name is $name, and my age is $age years old.'

输出结果:

My name is $name, and my age is $age years old.

在这种情况下,$name$age 不会被替换为变量的值,而是被当作普通文本输出。

大括号 ({})

大括号用于明确变量的边界,避免歧义,尤其在拼接字符串时非常有用。例如,当变量后面跟着其他字符时,使用大括号能够清晰地指出变量的结束位置。

echo "My name is ${name}, and my age is ${age} years old."

输出结果:

My name is xiaoyu, and my age is 27 years old.

如果没有使用大括号,Shell 可能会误认为变量名已经结束,尤其是在变量后面接有其他字母或数字时。大括号确保了变量的正确解析。

不加引号的情况

尽管不加引号也能正常工作,但它有一些潜在的风险,特别是当变量值中包含空格时。例如:

name="Alice Wonderland"
echo My name is $name.

输出结果:

My name is Alice Wonderland.

不加引号时,如果 name 包含空格,Shell 会将其视为多个参数。这可能导致预期外的行为,因此通常推荐使用双引号来避免这种问题。

4. 删除变量

如果你需要删除一个变量,可以使用 unset 命令:

unset name

删除后,尝试访问该变量将返回空值。在你删除了变量之后,你可以通过 set 命令来查看当前所有定义的变量:

set | grep name

如果 name 已被删除,该命令将不返回任何内容。

5. 变量命名规则

Shell 中的变量命名规则非常简单,但有一些限制:

  • 只能包含字母、数字和下划线_),并且不能以数字开头。例如,name1 是合法的,而 1name 是非法的。
  • 不能包含空格,如果需要组合多个词,推荐使用下划线(_)分隔。例如,long_name="xiaoyu" 是合法的,而 long name="xiaoyu" 则会报错。
  • 变量名区分大小写。例如,nameName 是两个不同的变量,因此在命名时需要注意一致性。
my_name="xiaoyu"
my_name="longyu"
echo $my_name

输出结果:

longyu

通过合理使用引号、正确命名变量并遵循规范,有助于提高代码的可读性,避免命名冲突,确保脚本的稳定性和可维护性。


小结

Shell 脚本是一种强大的工具,通过编写脚本,我们可以自动化日常任务、管理系统、处理文件等。理解和熟练掌握变量的使用、控制结构和常见命令的执行方式,将极大提高我们在使用 Shell 脚本时的效率和灵活性。

最后,感谢您阅读本篇文章!如果您对文中内容有任何疑问或建议,欢迎在评论区与我交流!您的点赞和分享将是我继续创作的动力。

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

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

相关文章

【postman】怎么通过curl看请求报什么错

获取现成的curl方式: 1,拿别人给的curl 2,手机app界面通过charles抓包,点击接口复制curl 3,浏览器界面-开发者工具-选中接口复制curl 拿到curl之后打开postman,点击import,粘贴curl点击send&am…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十三)图优化SLAM的本质

一、直白解释slam与图优化的结合 我从b站上学习理解的这个概念。 视频的大概位置是1个小时以后,在第75min到80min之间。图优化SLAM是怎么一回事。 slam本身是有运动方程的,也就是运动状态递推方程,也就是预测过程。通过t1时刻&#xff0c…

哔哩喵 2.3.11 | 非常好用的第三方B站客户端

哔哩喵是一款非常好用的第三方B站客户端,它允许用户查看各个分区在每个时间段的热门视频列表,支持关键字和UP主屏蔽功能,并能通过添加代理服务器来观看受地区限制的番剧。最新版本2.3.11更新了多项功能,包括个人中心头像及动态大图…

算法定制LiteAIServer摄像机实时接入分析平台玩手机打电话检测算法:智能监控的新篇章

在现代社会,随着智能手机的普及,无论是在工作场所还是公共场所,玩手机或打电话的行为日益普遍。然而,在某些特定环境下,如工厂生产线、仓库、学校课堂等,这些行为可能会影响到工作效率、安全或教学秩序。为…

11个c语言编程练习题

0. 钞票和硬币 money.c 读取一个带有两个小数位的浮点数,代表货币价值。将该值分解为多种钞票和硬币的和,要求使用的钞票和硬币的总数量尽可能少。 货币面值有100,50,20,10,5,1,0.…

【go从零单排】Signals、Exit

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,信号(signals)是操作系统用来通…

PyAEDT:Ansys Electronics Desktop API 简介

在本文中,我将向您介绍 PyAEDT,这是一个 Python 库,旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写,从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…

教你制作更方便快捷的电子产品目录!

​在现代工作环境中,电子产品目录进入目录内容的分类的制作。按照电子产品的是至关类型进行重要的分类,环节如:一个清晰、详尽手机、便于、电脑查找的电子产品目录,平板不仅能提高工作效率,还能给客户留下良好的印象。…

硬件工程师之电子元器件—二极管(5)之肖特基二极管

写在前面 本系列文章主要讲解二极管的相关知识,希望能帮助更多的同学认识和了解二极管。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 二极管 9. 肖特基二极管(SBD) 肖特基势垒二极管(SBD)作为一种二极管&#…

实习冲刺第二十一天

14.最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight"] 输出:"fl"示例…

游戏引擎学习第11天

视频参考:https://www.bilibili.com/video/BV1QLmDYQE3n 平台层的编写 应该是平台可移植什么的吧 逐项补充说明: 存档位置 在游戏或应用程序中,需要保存用户的进度、设置和数据,存档位置是指存放这些数据的文件夹路径。通常,平台…

炼码LintCode--数据库题库(级别:入门;数量:144道)--刷题笔记_01

目录 炼码LintCode数据库入门级别的笔记未完待续~~~ 炼码LintCode 数据库 入门级别的笔记 笔记如下,把所有涉及到的入门级别的知识点简单总结了一下。 以及一点点举一反三的写法。 增 INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);批量增 INSERT INT…

ab (Apache Bench)的使用

Apache Bench(ab)是一个用于基准测试HTTP Web服务器的命令行工具,广泛用于评估和优化Web服务器的性能。以下是关于Apache Bench的详细介绍,包括其功能、使用方法、常用参数和输出结果解析。 功能 性能测试:通过模拟多…

Cellebrite VS IOS18Rebooting

Cellebrite VS IOS18Rebooting我们想分享一些有关 iOS 18 重启“功能”的信息。在过去一周左右的时间里,人们对 iOS 18 中一项新的未记录功能产生了极大关注,该功能会导致设备在一段时间不活动后重新启动。 这意味着,如果设备在一定时间不活…

YZ系列工具之YZ10:VBA_梦幻图像

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套一部VBA手册,教程分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的…

企业网络安全管理策略

随着互联网和信息技术的飞速发展,网络安全威胁日益严峻,企业若不加强网络安全管理,可能会面临数据泄露、系统崩溃等严重后果。为了帮助企业有效应对这些挑战,以下是网络安全专家为您整理的五个策略,以提升网络安全防护…

如何禁用VMware虚拟网卡

安装VMWare虚拟机之后,会在本地创建两个虚拟网卡VMware Network Adapter VMnet1和VMware Network Adapter VMnet8,如果使用iNode客户端联网时会进行禁用多网卡检测,否则无法联网。因此,问题根源就在于虚拟网卡未禁用。 1、网络和…

11.13机器学习_贝叶斯和决策树

八 朴素贝叶斯分类 1 贝叶斯分类理论 假设现在我们有一个数据集,它由两类数据组成,数据分布如下图所示: 我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率,用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色…

Easyui ComboBox 数据加载完成之后过滤数据

Easyui ComboBox 数据加载完成之后过滤数据 需求 在ComboBox 下拉框中过滤包含"物联网"三个字的选项 现状 期望 实现方式 使用 combobox 的方法在加载时过滤 loadFilter 方式一&#xff1a;HTML中编写 <input id"enterpriseDepartmentCode" name&…

vue跳转传参

path 跳转只能使用 query 传参 ,name 跳转都可以 params &#xff1a;获取来自动态路由的参数 query &#xff1a;获取来自 search 部分的参数