内容预览 ≧∀≦ゞ
- 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(如bash
或dash
)的符号链接。 -
/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脚本的特点
- 解释型语言:Shell 脚本属于解释型语言,不需要事先编译。Shell 解释器会逐行解析并执行脚本中的命令,适合快速开发和调试,尤其是在系统管理和自动化任务中。
- 交互性:Shell 提供了交互式命令行界面,支持用户在运行脚本时与其交互。用户可以在脚本执行过程中提供输入,根据输入的内容,脚本可以执行不同的操作。
- 灵活性:Shell脚本支持多种命令类型,包括内置命令、外部命令、以及通过脚本自定义的命令。通过控制结构(如条件语句、循环语句等),Shell脚本能够执行复杂的逻辑和任务。
- 可移植性:大多数 Shell 脚本可以在不同的操作系统和Shell解释器上运行。虽然有些Shell具有特定的功能,Shell脚本在不同系统上的兼容性通常较好,可以帮助开发人员实现跨平台自动化任务。
Shell脚本的基本语法
-
变量:
- 定义与使用:Shell脚本支持使用变量来存储数据(如字符串、数值等),并可以在脚本中随时调用。例如,使用
name="xiaoyu"
定义一个变量name
,然后通过$name
或${name}
引用该变量。 - 预定义变量:Shell 提供了一些内置的预定义变量,如
$HOME
(用户的主目录),$PATH
(可执行文件路径),$USER
(当前用户名)等。 - 环境变量与位置变量:环境变量是影响Shell环境的全局变量,位置变量则是通过脚本参数传递的变量(如
$1
,$2
,"$@"
等)。
- 定义与使用:Shell脚本支持使用变量来存储数据(如字符串、数值等),并可以在脚本中随时调用。例如,使用
-
运算符:
- 算术运算符:Shell支持基本的数学运算,如加法(
+
)、减法(-
)、乘法(*
)、除法(/
)等,使用(( ))
或let
来进行数值计算。 - 逻辑运算符:Shell支持常见的逻辑运算符,如与(
&&
)、或(||
)、非(!
)等,用于控制流程和判断条件。 - 字符串运算符:例如字符串的拼接、长度获取(
${#var}
)、子串提取(${var:position:length}
)等操作。
- 算术运算符:Shell支持基本的数学运算,如加法(
-
控制结构:
- 条件语句:Shell支持
if-else
语句、case
语句等,用于根据不同的条件执行不同的操作。例如,if [ condition ]; then ... fi
用于根据条件判断执行特定命令。 - 循环语句:Shell支持
for
循环(用于遍历列表)、while
循环(基于条件判断执行)、until
循环(直到条件为真时停止)等。可以使用这些语句进行重复任务处理。 - 跳转语句:如
break
(跳出循环)、continue
(跳过当前循环)等,便于控制脚本执行流程。
- 条件语句:Shell支持
-
函数:
- 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
环境变量中。
第四步:其他运行方式
除了直接使用 ./
执行脚本,还可以使用其他方法:
-
使用
sh
命令执行:如果不想给脚本赋予执行权限,可以使用
sh
命令来运行脚本:sh 1.sh
这种方法不会要求文件具备执行权限,
sh
会自动解析并执行脚本中的命令。它会启动一个新的Shell进程来执行脚本,且与直接使用./
执行脚本相比,存在一些行为上的差异。比如,脚本的环境变量不会直接影响到当前Shell环境。 -
使用
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"
则会报错。 - 变量名区分大小写。例如,
name
和Name
是两个不同的变量,因此在命名时需要注意一致性。
my_name="xiaoyu"
my_name="longyu"
echo $my_name
输出结果:
longyu
通过合理使用引号、正确命名变量并遵循规范,有助于提高代码的可读性,避免命名冲突,确保脚本的稳定性和可维护性。
小结
Shell 脚本是一种强大的工具,通过编写脚本,我们可以自动化日常任务、管理系统、处理文件等。理解和熟练掌握变量的使用、控制结构和常见命令的执行方式,将极大提高我们在使用 Shell 脚本时的效率和灵活性。
最后,感谢您阅读本篇文章!如果您对文中内容有任何疑问或建议,欢迎在评论区与我交流!您的点赞和分享将是我继续创作的动力。