目录
前言
一、认识 Shell
1.1 Shell 的定义与作用
1.2 Shell 解释器
二、Shell 脚本入门
2.1 编写 Shell 脚本
2.2 赋予执行权限与执行脚本
三、Shell 变量
3.1 变量定义与规则
3.2 变量使用与操作
3.3 变量类型
四、Shell 字符串
4.1 字符串定义方式
4.2 字符串常用操作
示例
前言
在 Linux 系统操作与自动化任务处理中,Shell 脚本是提升效率的实用工具。本文基于《Shell.pdf》内容,梳理 Shell 编程的核心知识,从基础概念到实际应用,用简洁的语言和清晰的表格呈现关键要点,帮助读者快速掌握 Shell 脚本的编写与使用方法。
一、认识 Shell
1.1 Shell 的定义与作用
Shell 是用 C 语言编写的程序,充当用户与操作系统内核之间的桥梁,用户通过 Shell 可访问内核服务。它既可以作为命令语言,接收并执行用户输入的命令;也能作为程序设计语言,编写脚本实现复杂操作,类似于 DOS 系统下的command
和cmd.exe
。
1.2 Shell 解释器
Shell 编程需借助文本编辑器编写代码和脚本解释器执行代码。Linux 系统中 Shell 解释器种类多样,一个系统可存在多个 Shell,通过cat /etc/shells
命令可查看系统已安装的 Shell。其中,bash
因易用且免费,在日常工作中应用广泛,也是多数 Linux 系统的默认 Shell。
Shell 类型 | 特点 | 适用场景 |
---|---|---|
/bin/bash | 易用、免费、功能丰富 | 日常脚本开发、系统管理(默认选择) |
/bin/sh | 轻量、兼容性强 | 简单脚本执行、早期系统环境 |
/sbin/nologin | 禁止用户登录 | 系统账号安全控制 |
二、Shell 脚本入门
2.1 编写 Shell 脚本
使用vi
编辑器新建脚本文件,文件扩展名通常为.sh
(不影响脚本执行)。脚本基本结构包含指定解释器、注释和可执行语句三部分。#!
是约定标记,用于告知系统脚本所需的解释器,echo
命令则用于向窗口输出文本。
示例:创建hello.sh
脚本
#!/bin/bash # 指定解释器为bash
# 第一个Shell脚本,输出Hello World
echo "Hello World!" # 输出文本
[root@localhost ~]# mkdir shelldemo #创建文件夹
[root@localhost ~]# cd shelldemo
[root@localhost shelldemo]# ll
总用量 0
[root@localhost shelldemo]# vim hello.sh #创建一个shell脚本程序
[root@localhost shelldemo]# cd
[root@localhost ~]# ls
anaconda-ks.cfg lisa_cpu.sar usr.tar.gz 图片 桌面
BaiduNetdisk_5.5.3.exe mysql80-community-release-el7-3.noarch.rpm 公共 文档
CentOS-7-x86_64-DVD-2009.iso mysql80-community-release-el7-3.noarch.rpm.1 模板 下载
initial-setup-ks.cfg shelldemo 视频 音乐
2.2 赋予执行权限与执行脚本
新创建的脚本文件默认无执行权限,需通过chmod +x ./脚本文件名
命令赋予执行权限。执行脚本有多种方式,不同方式在权限要求和执行环境上存在差异。
执行方式 | 命令示例 | 特点 | 是否需要执行权限 |
---|---|---|---|
相对路径执行 | ./hello.sh | 在当前目录查找并执行脚本 | 是 |
绝对路径执行 | /root/shelldemo/hello.sh | 通过完整路径定位并执行脚本 | 是 |
解释器参数执行 | sh hello.sh | 直接调用解释器,脚本作为参数 | 否 |
[root@localhost shelldemo]# ll
总用量 4
-rw-r--r-- 1 root root 34 8月 28 09:38 hello.sh
[root@localhost shelldemo]# ls
hello.sh
[root@localhost shelldemo]# vi hello.sh
[root@localhost shelldemo]# chmod +x ./hello.sh
[root@localhost shelldemo]# ll
总用量 4
-rwxr-xr-x 1 root root 34 8月 28 09:43 hello.sh
[root@localhost shelldemo]# ./hello.sh
hello world!
三、Shell 变量
3.1 变量定义与规则
变量通过变量名=值
的格式定义,等号两边不能有空格。变量名命名需遵循特定规则,确保脚本可正常识别和使用变量。
命名规则 | 说明 |
---|---|
首字符 | 必须为字母(a-z, A-Z) |
字符组成 | 可包含字母、数字和下划线,不能有空格 |
特殊字符 | 不能使用标点符号 |
关键字 | 不能使用 bash 中的关键字(可通过 help 命令查看) |
示例:
your_name="bigdata.com" # 正确定义变量
student_age=20 # 多单词用下划线分隔,符合命名规则
3.2 变量使用与操作
使用变量时,在变量名前加$
即可,也可通过${变量名}
明确变量边界,避免歧义。已定义的普通变量可重新赋值,通过readonly
命令可将变量定义为只读变量,只读变量的值不能修改;unset
命令可删除普通变量,但无法删除只读变量。
操作类型 | 命令示例 | 说明 |
---|---|---|
引用变量 | echo $your_name 、echo ${your_name} | 两种方式均可引用变量,${} 可明确边界 |
修改变量 | your_name="new_value" | 仅普通变量可修改 |
定义只读变量 | readonly var="test" | 变量赋值后不可修改 |
删除变量 | unset your_name | 仅能删除普通变量 |
3.3 变量类型
Shell 变量主要分为局部变量和全局变量(环境变量),二者在作用范围上存在明显区别。
变量类型 | 作用范围 | 示例 |
---|---|---|
局部变量 | 仅在当前 Shell 实例中有效,其他 Shell 启动的程序无法访问 | 在当前终端定义 name="hadoop",新终端中 echo $name 无输出 |
全局变量 | 所有程序(包括 Shell 启动的程序)均可访问 | 通过 export 命令导出的变量,在子 Shell 中可使用 |
ps. set可以查看当前环境变量
四、Shell 字符串
4.1 字符串定义方式
字符串可使用单引号、双引号或不加引号定义,不同定义方式在变量识别和特殊字符处理上存在差异。
定义方式 | 特点 | 示例 | 输出结果 |
---|---|---|---|
单引号 | 不识别变量和特殊字符,原样输出 | str='I am good at $skill'(skill="linux") | I am good at $skill |
双引号 | 可识别变量和转义字符 | str="I am good at $skill"(skill="linux") | I am good at linux |
无引号 | 不能包含空格,可识别变量 | str=Iamgoodat$skill(skill="linux") | Iamgoodatlinux |
4.2 字符串常用操作
字符串支持获取长度、提取子字符串和查找子字符串等操作,通过特定语法可实现这些功能。
操作类型 | 语法示例 | 说明 |
---|---|---|
获取长度 | ${# 字符串变量} | 如 ${#skill}(skill="hadoop"),输出 6 |
提取子字符串 | 字符串索引、{字符串:索引:长度} | 索引从 0 开始,如 ${str:2}(str="I am..."),从第 2 个字符开始提取 |
查找子字符串 | expr index "$str" 子字符串 | 位置从 1 开始计算,如expr index "$str" am (str="I am..."),输出 3 |
示例
1.获取字符串长度:
2.提取子字符串:
3.查找字符串:(从1开始计数)
4. 参数传递
补充:
$@
:表示传递给脚本或函数的所有参数列表,每个参数都是独立的。
例如,当执行 ./script.sh a b c
时,在脚本中 $@
会展开为 "a" "b" "c"
(保留每个参数的独立性)
通常与循环结合使用,遍历所有参数:
for arg in "$@"; doecho "参数: $arg"
done
$?
:表示上一条命令执行后的退出状态码。
状态码为 0
表示命令执行成功
非 0
表示命令执行失败(不同的非零值可能代表不同的错误类型)
示例:
ls non_existent_file
echo "退出码: $?" # 会输出非0值,表示ls命令执行失败
5.运算符的基本使用
总结
1、shell 简介绍:shell 是一个命令解释器 ,它将用户输入命令将转化为计算机可以执行的命令,并且结果反馈给用户
2、shell 的作用:shell 是linxu系统中的命令解释器 ,负责接受用户的指令并将其传递给内核执行,最终输出结果
3、shell 能干什么:自动化安装部署,比如说搭建论坛;自动化完成 系统批量添加用户 比如说 500用户;数据库备份 自动化完成;探测服务器负载 ;访问网站 每天 访问次数;
4、shell 场景
大量重复工作 大量批量操作 主要是为了提高效率 节约时间
5、shell 脚本的构成5.1 第一行 # !/bin/bash 默认的解释器(脚本申明) 程序 执行 我们的脚本5.2 # 开头是注释脚本 就是不会执行里面的内容5.3 创建程序(脚本)的步骤① 创建一个包含命令语句 后期 在加上 控制结构② 修改你创建的文件权限 chmod + x 0805.shell③ 运行 检查脚本语法是否错误④ 执行 脚本 ./0805.sh5.4 shell脚本执行① ./0805.sh 执行 必须要给他执行权限② /opt/0805.sh 必须要给他执行权限③ 程序执行 sh 0805.sh bash 0805.sh 可以没有执行权限注意:执行 可以 当前路径 或者 绝对路径④ source 0805.sh 可以没有执行权限 ⑤ sh < 0805.sh
6、shell 变量6.1 变量的语法 变量名=值 变量名 临时存放数据的位置值 临时存放可变化的数据 A=/etc/yum.repo.d/注:格式 等号两边不能有空格 并且变量名称需要以字母或下划线开头,各种特殊字符不能包含(如+、,、。?*&等) 6.2 变量的使用: $变量名 或 ${变量名} 6.3 修改变量中的值: 变量名=新的值 针对普通变量 6.4 只读变量: readonly 变量名=初始值 只读变量在初始化后不能修改初始值,只读变量不能被删除6.5 删除变量(只能删除普通变量): unset 变量名6.6 变量类型: 全局变量(整个用户或者环境都可以使用变量(环境变量)) 局部变量(本地变量 只能在当下使用)
7、字符串7.1 单引号 不识别变量7.2 双引号 可以识别变量可以直接调用变量7.3 ${#字符串} #字符串的长度 包括空格7.4 提取字符串 ${字符串:索引} # 索引从开始计算this is zjl012345678910${字符串:索引:长度}7.5 查找字符串 `expr index 字符串 子字符串` 从1开始计算位置 注意:expr 是以单个字符查找 如果中间有重复字母会显示前面字符的索引
8、shell 传递参数8.1 shell传递参数 ./demo04.sh(shell程序) 参数1 参数2 参数3 参数n8.2 shell 中接受的参数 $n n 代表一个数 $1 第一个参数 $2 第二个参数$* 输出: 作为一个完整的字符串$@ 输出: 参数的列表$# 参数的个数$? 查看上一个命令是否正确$$ 当前脚本运行的进程ID$! 后台运行的最后一个进程ID
9、运算符 在shell 中 使用一款计算工具 ,他能完成表达式的求值操作 (算术、关系、逻辑、字符串)加(+) 减(-) 乘(*) 除(/) 取余(%) 注: * 在系统中是代表所有 ,所以这边需要转义符(\)进行转成普通字符逻辑运算:&&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值 才为 0(结果成立)。使用 test命令测试时,“&&”可改为“-a”。||:逻辑或,表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为 0(结果成立)。使用 test 命令测试时,“||”可改为“-o”。!:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为 0(结果成立)。
今日份科普先到这里啦,明天继续~~