linux-Shell 编程-Shell 脚本基础
Linux Shell 编程:Shell 脚本基础
在Linux系统中,Shell脚本是一种强大的自动化工具。通过编写Shell脚本,用户可以自动化重复性任务、系统管理操作和程序控制流程,极大提高工作效率。
1. 什么是Shell脚本?
Shell脚本是由一系列Linux命令组成的文本文件,通常用于自动化完成任务。Shell脚本可以在终端中运行,而无需逐个输入命令。Shell脚本的扩展名通常为.sh
,但这不是强制性的。
1.1 Shell类型
常见的Shell有多种,其中最常用的包括:
- Bash(Bourne Again Shell):Linux系统中最常用的Shell,功能强大且兼容性好。
- Sh(Bourne Shell):Bash的前身,较为简洁。
- Zsh(Z Shell):功能更丰富的Shell,但与Bash有些不兼容。
本文主要基于Bash进行讲解。
1.2 Shell脚本的基本结构
一个简单的Shell脚本示例如下:
#!/bin/bash
# 这是一个简单的Shell脚本示例
echo "Hello, World!"
#!/bin/bash
:这行称为Shebang,告诉系统使用哪个解释器(如/bin/bash
)来执行脚本。#
:注释符号,后面的内容会被Shell忽略。
1.3 创建和运行Shell脚本
-
创建一个脚本文件,例如
script.sh
:nano script.sh
-
在文件中输入脚本内容:
#!/bin/bash echo "Hello, Linux!"
-
保存并退出文件后,给予执行权限:
chmod +x script.sh
-
运行脚本:
./script.sh
输出将是:
Hello, Linux!
2. Shell 脚本中的变量
2.1 变量的定义与使用
在Shell脚本中,变量的使用是非常灵活的。变量名必须以字母或下划线开头,不能以数字开头。赋值和引用变量的基本格式如下:
-
定义变量
name="Alice"
-
引用变量
在引用变量时,需要在变量名前加上$
符号:echo "Hello, $name"
2.2 变量的作用域
- 全局变量:可以在脚本中的任何地方使用,通常是通过直接定义的变量。
- 局部变量:可以使用
local
关键字定义,通常用于函数内,生命周期仅限于函数执行期间。
2.3 环境变量
环境变量是Shell脚本中预定义的全局变量,例如:
$HOME
:当前用户的主目录。$USER
:当前登录的用户名。$PATH
:存储可执行文件的搜索路径。
可以使用echo
命令查看环境变量的值:
echo $HOME
echo $USER
echo $PATH
2.4 命令替换
Shell脚本中可以通过命令替换来将命令的输出赋值给变量。两种常用的命令替换方式:
-
使用反引号
`command`
:result=`date`
-
使用
$()
语法:result=$(date)
3. Shell 脚本中的控制结构
控制结构用于控制脚本的执行流程,包括条件语句和循环。
3.1 条件语句
Shell脚本中常用的条件语句包括if-else
结构和case
语句。
-
if-else 语句:
#!/bin/bash num=10 if [ $num -gt 5 ]; thenecho "num大于5" elseecho "num小于或等于5" fi
条件判断需要使用
[
和]
,注意必须在[
和条件之间留有空格。 -
if-elif-else 语句:
#!/bin/bash num=8 if [ $num -gt 10 ]; thenecho "num大于10" elif [ $num -eq 8 ]; thenecho "num等于8" elseecho "num小于8" fi
-
case 语句:
case
结构用于匹配多个模式:#!/bin/bash animal="cat" case $animal in"cat")echo "这是只猫";;"dog")echo "这是只狗";;*)echo "未知动物";; esac
3.2 循环
Shell脚本支持多种循环结构。
-
for 循环:
用于遍历一组数据:for i in 1 2 3 4 5; doecho "数字: $i" done
-
while 循环:
根据条件循环执行命令:count=1 while [ $count -le 5 ]; doecho "计数: $count"count=$((count + 1)) done
-
until 循环:
until
循环与while
相反,直到条件为真时才会停止:count=1 until [ $count -gt 5 ]; doecho "计数: $count"count=$((count + 1)) done
4. 常见的Shell脚本命令
4.1 文件和目录操作
-
创建目录:
mkdir new_directory
-
删除文件或目录:
rm filename rmdir directory_name
-
移动或重命名文件:
mv old_filename new_filename
-
复制文件:
cp source_file destination_file
4.2 文本操作
-
查看文件内容:
cat filename
-
查找文本:
使用grep
命令查找文件中包含特定模式的行:grep "pattern" filename
-
文件内容重定向:
将命令输出重定向到文件:echo "Hello" > output.txt # 覆盖文件 echo "World" >> output.txt # 追加到文件末尾
4.3 管道和重定向
-
管道(
|
):
将一个命令的输出作为另一个命令的输入:ls | grep ".txt"
-
标准输出与错误输出重定向:
command > output.txt 2> error.txt # 分别将标准输出和错误输出重定向到不同的文件 command &> all_output.txt # 将所有输出重定向到同一个文件
5. Shell 脚本中的函数
Shell脚本中可以定义函数,用于复用代码块,提高脚本的可读性和维护性。
5.1 定义函数
定义函数的基本语法如下:
function_name() {# 函数体echo "Hello from function"
}
5.2 调用函数
函数定义后,可以通过函数名直接调用:
#!/bin/bash
greet() {echo "Hello, $1!"
}greet "Alice"
输出为:
Hello, Alice!
在这个示例中,$1
表示传递给函数的第一个参数,类似地,$2
表示第二个参数。
6. Shell脚本调试
在编写Shell脚本时,难免会遇到错误。通过以下方式可以方便地调试脚本:
-
使用
-x
选项运行脚本:
-x
选项会在脚本执行时打印每一行命令及其结果,帮助排查问题:bash -x script.sh
-
在脚本中启用调试模式:
可以在脚本中加入set -x
来启用调试模式,set +x
来关闭调试模式:set -x # 调
试代码
set +x
---### 7. 实用脚本示例以下是一个用于备份目录的简单脚本:```bash
#!/bin/bashbackup_dir="/home/user/data"
backup_dest="/home/user/backup"# 检查目标目录是否存在
if [ ! -d $backup_dest ]; then
mkdir -p $backup_dest
fi# 创建备份文件
tar -czf $backup_dest/backup_$(date +%Y%m%d).tar.gz $backup_direcho "备份完成!"
这个脚本会将/home/user/data
目录打包为tar.gz
文件,并保存在/home/user/backup
目录下,文件名包含日期。
总结
Shell脚本是Linux系统管理中不可或缺的工具。通过Shell编程,用户可以自动化处理系统任务、文件操作、网络操作等一系列功能。本文介绍了Shell脚本的基础知识,包括变量、控制结构、常见命令、函数和调试技术,掌握这些基础后,用户可以编写更复杂的脚本来提高工作效率。
相关文章:
linux-Shell 编程-Shell 脚本基础
Linux Shell 编程:Shell 脚本基础 在Linux系统中,Shell脚本是一种强大的自动化工具。通过编写Shell脚本,用户可以自动化重复性任务、系统管理操作和程序控制流程,极大提高工作效率。 1. 什么是Shell脚本? Shell脚本是…...

Linux运维篇-tigervnc工具的使用
目录 简介下载使用clientserver配置文件服务管理 设定密码(先切换成对应的用户):配置多用户的VNC tigervnc连接排错一、vnc密码错误二、vncserver端口忘记了三、连接很卡,或者画面没有反应四、服务报错 简介 TigerVNC是VNC的一种…...

基于Spark的电影推荐系统设计与实现(论文+源码)_kaic
摘 要 在云计算、物联网等技术的带动下,我国已步入大数据时代。电影是人们日常生活中重要的一种娱乐方式,身处大数据时代,各种类型、题材的电影层出不穷,面对琳琅满目的影片,人们常感到眼花缭乱。因此,如…...

基于python+django+vue的医院预约挂号系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…...

镀金引线---
一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式,它们各有优劣势,选择哪种方式取决于具体的应用需求和预算。 沉金(ENIG)是一种常用的金手指处理方式,它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…...

『功能项目』窗口可拖拽脚本【59】
本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目, 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本:DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…...

Map--08--CurrentHashMap 与 Hashtable的异同?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Map方法computeIfAbsent1.computeIfAbsent 方法的简介2.案例computeIfAbsent() Map方法computeIfAbsent computeIfAbsent方法是Java 8中引入的一种简化操作Map的方…...
Docker学习笔记(三)存储与卷
挂载机制介绍 我们都知道,默认下,Docker容器与宿主机是完全隔离的,这种特性使得我们创建与删除容器都变得更方便,不需要再去删除宿主机上容器遗留下来的痕迹。 但是,当我们使用数据库一类需要持久化数据、共享数据…...

硬件工程师笔试面试——滤波器
目录 12、滤波器 12.1 基础 滤波器原理图 滤波器实物图 12.1.1 概念 12.1.2 滤波器的分类 12.1.3 滤波器的工作原理 12.1.4 滤波器的应用 12.1.5 滤波器设计的关键参数 12.2 相关问题 12.2.1 不同类型的滤波器在实际应用中的具体作用是什么? 12.2.2 如何设计一个简…...
【SpringBoot3】面向切面 AspectJ AOP 使用详解
文章目录 一、AspectJ介绍二、简单使用步骤1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点(Pointcut)1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知࿰…...

wav怎么转mp3格式?给你推荐几种音频格式转换方法
wav怎么转mp3格式?将wav文件转换为MP3格式是一个常见的操作,尤其适用于需要节省存储空间或确保文件兼容性的场景。wav文件保存了音频的所有原始数据,这使得它们的文件体积往往非常庞大。相比之下,MP3格式通过有损压缩技术显著减小…...

Redis的AOF持久化、重写机制、RDB持久化、混合持久化
1、AOF持久化 1.1.AOF持久化大致过程 概括:命令追加(append)、文件写入、文件同步(sync) Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候&#…...
Dom4j使用xpath查询xml文
Dom4j使用xpath查询带有命名空间的xml文件 方式1 忽略命名空间 DocumentFactory factory DocumentFactory.getInstance(); SAXReader reader new SAXReader(factory); Document document reader.read(xmlFilePath); Element rootElement document.getRootElement(); Nod…...
国家专精特新小巨人企业指标解析与扶持领域
一、什么是国家专精特新小巨人 (一)概念与定义 专精特新“小巨人”企业是指那些在细分市场中具有专业化、精细化、特色化和新颖化特征的中小企业中的佼佼者。这些企业在创新能力强、市场占有率高、掌握关键核心技术以及质量效益方面表现突出࿰…...

进程的属性
tips: task_struct就是linux下的PCB 操作系统不相信任何外部用户,而是只提供窗口,不可能直接与用户打交道,而是通过操作系统 tast_struct用来描述所有进程,用来管理 ; 和 && 可以同时跑两个命令 进…...
Git 中的refs
在 Git 中,refs 是用来存储 Git 对象(如提交、树、标签等)的引用。每个 ref 都是一个指针,指向一个特定的 Git 对象。以下是 Git 中几种常见的 refs 及其含义: 1. refs/heads/ 表示:本地分支。 用途&…...
408算法题leetcode--第六天
58. 最后一个单词的长度 58. 最后一个单词的长度思路:反向遍历时间:O(n);空间:O(1) class Solution { public:int lengthOfLastWord(string s) {int id s.size() - 1;while(s[id] ){--id;}int ret 0;while(id > 0 &&…...
ubuntu64位系统无法运行32位程序的解决办法
在 64 位的 Ubuntu 系统上运行 32 位程序时,如果出现问题,可能是由于缺少 32 位库支持。以下步骤可以帮助你解决这一问题: 1. 启用 32 位架构 首先,确保系统支持 32 位架构。你可以通过以下命令添加 32 位架构支持: …...
深入理解Go语言中的并发封闭与for-select循环模式
在现代编程中,并发已经成为提高程序性能和响应能力的关键手段。然而,在并发环境下,如何安全地访问和操作共享数据却是一大挑战。本文将深入探讨Go语言中的**封闭(confinement)**技术,以及常见的for-select循环模式,帮助您编写更高效、更安全的并发代码。 并发编程中的安…...

Java学习Day42:骑龙救!(springMVC)
springMVC与sevlet都是对应表现层web的,但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标: 小案例: 1.导入依赖 spring-context: 提供 Spring 框架的核心功能,如依赖注入、事件发布和其他应用上…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...