目录
Shell脚本概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种Shell控制语句以完成更复杂的操作
就是与内核沟通的界面、应用程序等。
是一个特殊的应用程序,介于操作系统内核和用户之间,充当“命令解释器“的角色,负责接受用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
Shell脚本作用
Shell 脚本是一种用于自动化和批量执行操作的脚本语言。它可以在 Linux 或 Unix 系统上编写和运行,其中 Shell 是一个用户与操作系统内核之间的接口。
Shell 脚本的主要作用包括:
-
自动化任务:通过编写 Shell 脚本,可以自动执行多个命令或操作,从而简化重复性任务的执行。例如,定时备份文件、清理临时文件等。
-
批量处理:Shell 脚本允许批量处理数据或文件。您可以使用循环结构(如 for 循环)遍历目录中的文件,并对每个文件执行相同的操作。
-
系统管理:Shell 脚本提供了管理系统配置、用户账户以及安装/卸载软件等功能。这使得管理员能够快速设置和配置多台服务器。
-
运维工具:通过编写 Shell 脚本,您可以创建自定义工具来监控系统状态、分析日志、诊断问题等。这些工具能够帮助管理员更好地管理和维护系统。
-
命令组合和流程控制:利用 Shell 的各种语法元素(如条件判断、循环结构)以及管道符号(|)、重定向符号(>、<)等特性,您可以将多个命令组合起来并控制其执行流程。
-
跨平台移植性:Shell 脚本可以在不同的 Unix 系统上运行,因为大多数 Unix 系统都提供了标准的 Shell(如 Bash、Korn Shell),使得脚本具有较好的跨平台移植性。
Shell脚本种类
有多种不同的 Shell 脚本语言可供选择,以下是一些常见的 Shell 脚本类型:
-
Bash(Bourne Again Shell):Bash 是目前最常用的 Unix/Linux 系统默认 Shell,也是最流行的脚本语言之一。它是基于 Bourne Shell 的一个升级版本,提供了更丰富的功能和语法扩展。
-
sh(Bourne Shell):Bourne Shell 是 Unix 最早采用的标准命令行解释器,它具有简单、轻量级和高度可移植性等特点。许多现代系统仍然支持 Bourne Shell,并将其作为默认解释器。
-
KornShell(ksh):KornShell 是由 AT&T Bell 实验室开发的一种强大而灵活的脚本语言。它继承了 Bourne Shell 和 C 语言风格,并添加了许多增强功能,如命令历史记录、作业控制等。
-
CShell(csh):CShell 是类似于 C 语言风格的脚本语言,具有更丰富和易用的交互式 shell 功能。CShell 增加了许多对交互式使用者友好的特性。
-
TCSH:TCSH 是基于 CShell 的改进版本,提供了额外功能如命令补全和历史替换等。
-
Zsh:Zsh 是一个高度可定制的命令行解释器,具有强大的补全功能和扩展性。它融合了 Bash、KornShell 和 TCSH 的优点,并添加了许多自己独特的功能。
这些 Shell 脚本类型都可以在 Unix/Linux 系统上使用,并且具有各自的特点和语法。
Shell脚本构成
Shebang:脚本的第一行通常是一个特殊的注释,称为 shebang。它指定了用于解释脚本的 Shell 解释器,例如 表示使用 Bash 解释器。#!/bin/bash
-
注释:Shell 脚本中可以包含注释来提供说明和文档。注释以 开头,可以单独一行或跟随在代码后面。
#
-
变量定义:您可以定义变量来存储数据值。变量名通常以字母或下划线开头,并使用等号(=)进行赋值操作。例如 定义了一个名为 name 的变量并将其设置为 “John”。
name="John"
-
命令执行:Shell 脚本通过在新行上输入命令来执行操作。每个命令都是独立的一行或多个命令可以用分号 (;)分隔。
-
条件语句:条件语句允许根据条件执行不同的命令块。常见的条件语句如 if-else 和 case 语句。
-
循环结构:循环结构允许重复执行一组命令。常见的循环结构有 for、while 和 till 循环。
-
函数定义:函数允许将一组相关命令封装起来,并在需要时进行调用。
-
输入输出:Shell 脚本可以读取输入,并将输出发送到终端或文件。
Shell脚本执行方式
在终端中直接运行:将脚本文件作为可执行文件,并在终端中使用命令执行脚本。前提是您必须具有适当的执行权限。
./script.sh
-
使用 Shell 解释器执行:通过在终端中使用特定的 Shell 解释器来执行脚本,这种方法不需要设置可执行权限。
-
bash script.sh
-
sh script.sh
-
将脚本作为参数传递给其他命令进行执行:某些命令允许直接指定要运行的 Shell 脚本
-
source script.sh
-
. script.sh
-
添加到用户的 PATH 中并重启终端后,在任何地方都可以直接调用脚本名称来执行脚本。
-
在执行脚本时,需确保所需解释器已经安装,并且脚本文件具有正确的权限设置。
交互式硬件设备
Shell重定向操作
在Shell中,重定向是一种将命令的输入或输出从标准设备(通常是键盘和屏幕)转发到文件或从文件接收输入的操作。
1. 输出重定向(>
): 通过使用>
操作符,可以将命令的标准输出重定向到一个文件中。如果文件不存在,则会创建该文件;如果文件已经存在,则会覆盖文件内容。
ls > file.txt
这将执行ls
命令,并将结果输出到名为file.txt
的文件中。
2. 追加重定向(>>
): 使用>>
操作符,可以将命令的标准输出添加到一个文件的末尾,而不是覆盖文件内容。
echo "Hello, World!" >> file.txt
这将在file.txt
文件的末尾添加字符串"Hello, World!"。
3. 输入重定向(<
): 使用<
操作符,可以将文件中的内容作为命令的输入。
sort < file.txt
这将通过将file.txt
文件中的内容作为输入,对其进行排序。
4. 文件描述符重定向: Shell还支持对特定文件描述符进行重定向操作。文件描述符0表示标准输入,1表示标准输出,2表示标准错误输出。
2>
:将标准错误输出重定向到文件。
command 2> error.txt //覆盖内容
command 2>> error.txt //不覆盖内容
这将执行命令并将标准错误输出重定向到名为error.txt
的文件中。
&>
或>&
:将标准输出和标准错误输出合并,并重定向到文件。
command &> output.txt
这将执行命令,并将标准输出和标准错误输出合并后重定向到名为output.txt
的文件中
管道操作符号“|”
将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
Shell监测机制
bash -n [脚本名] 检查语法错误
bash -x [脚本名] 检查逻辑错误
变量的作用
Shell变量是一种用于存储和操作数据的符号名称。它们在shell脚本中起着重要的作用,可用于存储命令输出、用户输入和临时值。下面是Shell变量的主要作用概述:
-
存储和访问数据:变量允许用户将值存储在内存中,并通过名称引用这些值,以后随时进行访问和处理。
-
传递参数:变量可以用来传递参数给脚本或函数。当调用脚本或函数时,可以向变量传递值,并在其内部进行处理。
-
控制程序流程:变量可以用来控制程序的执行流程。通过检查变量的值,可以根据需要执行不同的代码路径。
-
存储命令输出:变量可以存储命令的输出结果,并在之后的代码段中使用。这对于需要多次使用相同命令的场景非常有用。
-
用户交互:变量提供了一种能够读取和存储用户输入的机制。这样脚本可以与用户进行交互,根据输入采取不同的行动。
-
脚本编程:变量在编写复杂的脚本时非常有用。它们使得代码更易于维护,因为可以使用变量来存储和引用各种值,而不需要手动编辑每个引用。
Shell变量提供了一种在脚本中存储、操作和处理数据的机制。
变量使用规范
-
命名规范:
- 变量名应该以字母或下划线开头,后续可以包含字母、数字和下划线。
- 变量名应该使用小写字母(避免与环境变量混淆)。
- 尽量使用有描述性的变量名,以增加可读性。
-
变量声明和赋值:
- 变量的声明不需要使用特殊关键字,直接通过赋值给变量即可创建。
- 赋值语句中变量名和等号之间不能有空格,例如:
name="John"
- 在引用变量时,使用
$
符号从变量中获取其值,例如:echo $name
-
变量的作用域:
- Shell中的变量默认是全局的,可以在脚本的任何位置访问和修改它们。
- 若要限制变量的作用域,可以在子shell中创建一个局部变量。
-
变量替换和引用:
- 使用
${变量名}
对变量进行替换来获取其值。 - 引用变量时最好使用双引号括起来,以防止变量展开时出现问题。
- 例如:
echo "Hello, ${name}"
- 使用
-
只读变量:
- 使用
readonly
关键字可以将一个变量设置为只读,防止其被修改。
- 使用
-
删除变量:
- 使用
unset
命令可以删除一个变量,被删除的变量将不再可用。
- 使用
赋值时:
` ` :反撇号 命令替换 ,把命令执行的结果,赋值给变量
' ' :单引号 强引用,用单引号打印变量,只会输出变量名,不输出值
" " :双引号 弱引用,打印变量的赋值
变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量、只读变量、位置变量、预定义变量
read提示字符内容
-p 指定提示符,提示用户输入数据
默认时新定义的变量只生效当前shell
全局变量:全部shell环境中都可以引用
环境变量
Shell环境变量是在操作系统中设置的一种变量,用于配置和控制Shell的行为。它们存储了诸如路径、默认参数和其他常用设置等信息,以便Shell可以根据这些变量来决定其执行的命令和行为。
以下是一些常见的Shell环境变量:
- PATH:指定Shell查找可执行程序的路径。当输入一个命令时,Shell会按照PATH中定义的顺序去这些路径下查找对应的可执行文件。
- HOME:指定当前用户的主目录路径。
- PWD:指定当前工作目录的完整路径。
- USER或USERNAME:指定当前登录用户的用户名。
- SHELL:指定当前使用的Shell程序的路径。
- PS1:Shell提示符的定义,用于控制Shell命令行的显示样式。
- LANG:指定当前Shell使用的语言环境。
- EDITOR:指定Shell预设的文本编辑器。
- TMP或TEMP:指定临时文件的存储路径。
要查看当前的所有环境变量,可以使用env
命令。要设置一个新的环境变量,可以使用export
命令,例如export MY_VARIABLE=value
。注意,通过export
设置的环境变量只在当前Shell会话中有效,如果想要永久保存环境变量,可以将其添加到Shell的配置文件(例如.bashrc
或.profile
)中。
位置变量
在shell脚本中,有一些已定义的位置变量可用于获取脚本的参数和传递给脚本的参数。以下是一些常见的shell位置变量:
-
$0
:表示当前脚本的名称。例如,如果脚本名为script.sh
,则$0
将返回script.sh
。 -
$1
,$2
,$3
, ...:这些变量表示传递给脚本的位置参数。例如,如果在命令行中执行脚本时提供了参数arg1 arg2 arg3
,那么$1
将是arg1
,$2
将是arg2
,$3
将是arg3
,以此类推。
预定义变量
-
$#
:表示传递给脚本的参数个数。例如,如果在命令行中执行脚本时提供了三个参数,则$#
将返回3
。 -
$@
:表示所有传递给脚本的参数列表。可以通过在循环中使用"$@"
来遍历所有参数。每个参数都被分开处理。 -
$*
:与$@
类似,表示所有传递给脚本的参数列表。但是,$*
将所有参数作为一个单词展开,并用空格隔开。通常用双引号括起来("$*"
)来保留参数之间的空格。 -
$?
:表示上一个命令的退出状态。如果上一个命令成功执行,$?
将返回0
;否则,返回一个非零值。
整数运算
使用数学表达式
加:
result=$((2 + 3))
echo $result # 输出 5
减:
result=$((10 - 5))
echo $result # 输出 5
乘:
result=$((4 * 6))
echo $result # 输出 24
除:
result=$((10 / 3))
echo $result # 输出 3
取余:
result=$((15 % 4))
echo $result # 输出 3
使用expr命令
result=$(expr 2 + 3)
echo $result # 输出 5
result=$(expr 10 - 5)
echo $result # 输出 5
result=$(expr 4 \* 6) # 注意乘法运算符 * 需要转义
echo $result # 输出 24
result=$(expr 10 / 3)
echo $result # 输出 3
result=$(expr 15 % 4)
echo $result # 输出 3
使用let命令
let result=2+3
echo $result
#输出 5
其余同上
bc
bc是一个简单易用的计算机程序,可用于执行基本的数学运算
a=$(echo 2*2 | bc)
输出 4
a=$`echo 2*2 | bc`
输出 4
i++ 相当于 i=$($i+1)
i-- 相当于 i=$($i-1)
i+=2 相当于 i=$($i+2)
i++ 先赋值再加
++i 赋值后再加