Linux Shell 脚本基础

目录

[Linux Shell 脚本基础](#Linux Shell 脚本基础)

[1. Shell 介绍](#1. Shell 介绍)

[2. 简单编写 Shell 脚本和执行](#2. 简单编写 Shell 脚本和执行)

[2.1 脚本编写规范](#2.1 脚本编写规范)

[2.2 示例:编写第一个 Shell 脚本](#2.2 示例:编写第一个 Shell 脚本)

[2.3 脚本执行方式](#2.3 脚本执行方式)

[3. Shell 变量(格式,使用,类型)](#3. Shell 变量(格式,使用,类型))

[3.1 变量定义格式](#3.1 变量定义格式)

[3.2 变量使用方式](#3.2 变量使用方式)

[3.3 变量类型](#3.3 变量类型)

[4. Shell 字符串(单引号,双引号,获取长度,提取,查找)](#4. Shell 字符串(单引号,双引号,获取长度,提取,查找))

[4.1 单引号与双引号的区别](#4.1 单引号与双引号的区别)

[4.2 获取字符串长度](#4.2 获取字符串长度)

[4.3 提取子串](#4.3 提取子串)

[4.4 查找子串](#4.4 查找子串)

[5. Shell 参数传递](#5. Shell 参数传递)

[5.1 常用位置参数变量](#5.1 常用位置参数变量)

[5.2 示例:参数传递与使用](#5.2 示例:参数传递与使用)

[5.3 \*和@的区别](#5.3 *和@的区别)

[6. Shell 运算符](#6. Shell 运算符)

[6.1 算术运算符](#6.1 算术运算符)

[6.3 逻辑运算符](#6.3 逻辑运算符)


Linux Shell 脚本基础

1. Shell 介绍

Shell 是 Linux 系统中连接用户与内核的 "命令解释器",它接收用户输入的命令,将其翻译成内核可理解的指令,执行后再将结果反馈给用户。简单来说,用户通过终端与 Shell 交互,间接操控 Linux 内核完成文件管理、进程控制、系统配置等操作。

常见的 Linux Shell 类型包括:Bash(Bourne Again Shell,Linux 系统默认 Shell,兼容性强、功能丰富)、Sh(Bourne Shell,早期基础 Shell)、Zsh(功能更强大的交互型 Shell,支持更多插件)等。其中 Bash 因默认预装、支持脚本编程和批量命令执行,成为企业运维中编写 Shell 脚本的首选。

Shell 的核心价值在于 "脚本编程"------ 将一系列 Linux 命令按逻辑组织到文本文件中,形成 Shell 脚本,通过执行脚本可自动化完成重复操作(如批量备份文件、定时检查服务状态、批量部署软件),大幅提升运维效率,减少人工操作失误。

2. 简单编写 Shell 脚本和执行

Shell 脚本是包含一系列命令的文本文件,编写与执行需遵循固定流程,以下为基础操作步骤:

2.1 脚本编写规范

  1. 指定解释器 :脚本第一行需通过 "#!"(称为 Shebang)指定 Shell 解释器,确保系统用正确的解释器执行脚本,默认 Bash 解释器写法为#!/bin/bash。
  2. 添加注释:用 "#" 开头的行表示注释,用于说明脚本功能、作者、编写时间或关键步骤,提升脚本可读性。
  3. 编写命令:将需执行的 Linux 命令按业务逻辑依次写入,命令格式与终端手动输入一致。

2.2 示例:编写第一个 Shell 脚本

需求:创建脚本hello.sh,实现 "输出欢迎信息 + 显示当前日期 + 列出当前目录文件" 功能,步骤如下:

用文本编辑器(如 vim)创建脚本文件:vim hello.sh

写入以下内容:

#!/bin/bash

echo "欢迎使用shell脚本!

保存退出:按Esc键,输入:wq保存并退出 vim。

2.3 脚本执行方式

Shell 脚本执行需先确保文件有 "执行权限",常见执行方式有两种:

赋予执行权限后直接执行

赋予权限:chmod +x hello.sh(+x 表示添加执行权限)。

执行脚本:若脚本在当前目录,可输入./hello.sh("./" 表示当前目录,)。

通过 Shell 解释器直接调用(无需执行权限)

格式:bash 脚本路径(或对应解释器,如sh hello.sh)。

示例:bash hello.sh,此方式无需提前赋予执行权限,适合临时测试脚本。

3. Shell 变量(格式,使用,类型)

Shell 变量用于存储数据(如字符串、数字、路径等),方便脚本中重复调用和修改,提升脚本灵活性。

3.1 变量定义格式

Shell 变量定义需遵循 "无空格" 原则,格式为:变量名=变量值,其中:

变量名:由字母、数字、下划线组成,不能以数字开头 (如name、file_1合法,1_file非法),建议使用大写字母,区分系统变量与自定义变量。

赋值符号 "=":两侧不能有空格 (如age=20合法,age = 20非法)。

变量值:若包含空格或特殊字符(如$),需用双引号或单引号包裹(如msg="Hello World")。

3.2 变量使用方式

使用变量时,需在变量名前加 ""符号,格式为`变量名或${变量名}`(后者在变量名与其他字符拼接时使用,避免歧义)。

只读变量: readonly 变量名=初始值 只读变量在初始化后不能修改初始值,只读变量不能被删除

删除变量(只能删除普通变量): unset 变量名

3.3 变量类型

Shell 变量无需显式声明类型,根据赋值内容自动区分,主要分为 3 类:

局部变量 :仅在当前 Shell 脚本或终端会话中生效,脚本执行结束或终端关闭后失效,如上述示例中的msg。

环境变量 :可在当前用户的所有 Shell 会话中生效,常用于传递系统配置(如PATH(命令搜索路径)、HOME(用户家目录)、USER(当前用户名)。

4. Shell 字符串(单引号,双引号,获取长度,提取,查找)

字符串是 Shell 脚本中最常用的数据类型,用于存储文本信息,支持单引号、双引号包裹,及长度获取、子串提取、内容查找等操作。

4.1 单引号与双引号的区别

单引号('') :强引用,包裹的内容原样输出 ,不解析变量、命令或特殊字符(如$、\)。

示例:输入 NAME="Linux"

然后输入echo '$NAME' 验证

双引号("") :弱引用,包裹的内容会解析变量和命令 (用(命令)或\`命令\`表示命令),特殊字符需用\\转义(如\\、\")。

示例:输入 NAME="Linux"

然后输入echo '$NAME' 验证

4.2 获取字符串长度

使用${#字符串变量名}格式,可快速获取字符串的字符个数(包括空格)。

示例:输入:msg="Hello Linux Shell"

然后输入echo "${#msg}" 验证

4.3 提取子串

从字符串中截取部分内容,格式为${字符串变量名:起始位置:截取长度},其中:

起始位置:从 0 开始计数(如字符串 "abcde",0 表示 "a",1 表示 "b")。

截取长度:可选参数,不指定则从起始位置截取到字符串末尾。

示例:以刚才的msg来提取,输入 echo "${str:0:5}"

4.4 查找子串

使用expr index "$字符串变量名" "查找的子串"格式,可获取子串中第一个字符在原字符串中的位置(从 1 开始计数,未找到返回 0);

示例:比如查找msg里的Linux里的L的位置,输入 echo `expr index "$msg" L `

5. Shell 参数传递

执行 Shell 脚本时,可向脚本传递参数(如./script.sh 参数1 参数2),脚本内部通过 "位置参数变量" 接收并使用这些参数,实现脚本的灵活调用。

5.1 常用位置参数变量

Shell 预设了一系列位置参数变量,用于接收外部传入的参数,核心变量如下:

0:表示脚本本身的文件名(如执行./hello.sh,0的值为./hello.sh)。

1:表示第一个参数,2表示第二个参数,......,9表示第九个参数;若参数超过 9 个,需用{10}、${11}表示(必须加{})。

$#:表示传入参数的总个数,用于判断参数是否完整。

\*:将所有参数视为一个整体字符串(如传入参数a b c,*的值为"a b c")。

@:将每个参数视为独立字符串(如传入参数a b c,@的值为"a" "b" "c")。

$?:表示上一条命令的执行结果(返回 0 表示执行成功,非 0 表示执行失败),常用于判断参数是否合法或命令是否执行成功。

脚本运行的当前进程 ID号 $! 后台运行的最后一个进程的 ID号 #### ******5.2 示例:参数传递与使用****** 创建脚本ce.sh,输入以下内容 #! /bin/bash echo "传入参数的总个数" $# echo "所有参数视为一个整体字符串 $\*" echo "脚本运行的但前进程号"

echo "后台运行的最后一个进程id号" $!

echo "将每个参数视为独立字符串 $@"

echo "判断命令是否正确" $?

echo $1

echo $2

wq保存,执行脚本输入 sh ce.sh 1 2 并判断结果

5.3 \*和@的区别

不被" "包含时:\*和@都以1 2... $n 的形式组成参数列表

被" "包含时:

*"\*" 会将所有的参数作为一个整体,以"1 2 ... n" 的形式组成一个整串

"@" 会将各个参数分开,以"1" "2" ... "n" 的形式组成一个参数列表

6. Shell 运算符

Shell 支持算术运算(如加减乘除)、比较运算(如大于、小于)和逻辑运算(如与、或),但需通过特定工具或语法实现,不能直接使用 "+、-、*、/" 等符号进行运算。

6.1 算术运算符

常用算术运算符包括:+(加)、-(减)、*(乘)、/(除,整数除法,舍去小数)、%(取余)、=(赋值)、==(等于,判断)、!=(不等于,判断)。

执行算术运算的 3 种常用方式:

使用 $((运算表达式)):最简洁的方式,支持所有算术运算符,示例:

分别输入 a=10,b=3,然后输入echo \[a+b\] 和 echo [a*b] 查看结果

使用 expr 运算表达式:需注意 "*" 需转义为\*,且运算符两侧需加空格。例如: 2+2 是不能运算的,必须写成 2 + 2 ,完整的表达式要被`符号包含,注意不是单引号,在 Esc 键下边

输入expr a + b 和 expr a \\\* b 查看结果

6.2 比较运算符

比较运算符主要用于判断数值大小或字符串是否相等,需在[](或[[]])中使用,核心运算符如下:

数值比较:-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)。

6.3 逻辑运算符

逻辑运算符用于组合多个判断条件,核心运算符如下:

&&(逻辑与):两个条件同时成立,结果为真。

||(逻辑或):两个条件任意一个成立,结果为真。

示例:a=10 b=3输入以下内容

&&不成立则输出为0

||成立,输出为1

相关推荐
czhc114007566310 小时前
Linux 830 shell:expect,ss -ant ,while IFS=read -r line,
linux·运维·r语言
滴滴滴嘟嘟嘟.11 小时前
嵌入式Linux驱动开发:蜂鸣器驱动
linux·运维·驱动开发
hit56实验室11 小时前
腾讯云的运维笔记——从yum的安装与更新源开始
运维·笔记·腾讯云
梅见十柒11 小时前
UNIX网络编程笔记:共享内存区和远程过程调用
linux·服务器·网络·笔记·tcp/ip·udp·unix
成都极云科技12 小时前
裸金属服务器与虚拟机、物理机的核心差异是什么?
运维·服务器·数据库
溯光笔记12 小时前
服务器内网穿透NPS搭建过程 - 服务端linux服务器 客户端windows系统 - 溯光笔记
linux·服务器·windows
2501_9301247012 小时前
Linux之Shell编程(三)流程控制
linux·前端·chrome
我命由我1234513 小时前
Word - Word 查找文本中的特定内容
运维·经验分享·笔记·word·运维开发·文档·文本
IDC02_FEIYA13 小时前
服务器托管多少钱一年?服务器托管收费标准
运维·服务器
Sadsvit14 小时前
Ansible 自动化运维工具:介绍与完整部署(RHEL 9)
linux·运维·centos·自动化·ansible