当前位置: 首页 > news >正文

Linux Shell Script 编写入门

Linux Shell 脚本是一种强大的工具,能够帮助用户自动化任务、简化系统管理以及提高工作效率。本文将带您全面了解如何编写 Linux Shell 脚本,并介绍一些常见的脚本编写技巧和注意事项。

目录

  1. 什么是 Linux Shell
  2. Shell 脚本的基本结构
  3. 常用 Shell 命令
  4. 变量与注释
  5. 条件判断与循环
  6. 函数与脚本调试
  7. Shell 脚本中的输入输出
  8. Shell 脚本的文件操作
  9. 实用脚本示例
  10. 高级脚本编写技巧
  11. 安全性与错误处理
  12. 结论

1. 什么是 Linux Shell

Shell 是 Linux 系统中的一种命令行解释器,它为用户提供了一个与操作系统交互的界面。常见的 Shell 包括 Bourne Shell (sh)、Bourne Again Shell (bash)、C Shell (csh) 和 Korn Shell (ksh) 等。Shell 脚本就是使用这些 Shell 语言编写的脚本文件,能够执行一系列命令。

  • Bourne Shell (sh): 最早的 Unix Shell,由 Steve Bourne 开发。
  • Bourne Again Shell (bash): GNU 项目的一部分,是目前最流行的 Shell。
  • C Shell (csh): 类似 C 语言语法的 Shell,由 Bill Joy 开发。
  • Korn Shell (ksh): 由 David Korn 开发,结合了 sh 和 csh 的优点。

2. Shell 脚本的基本结构

一个简单的 Shell 脚本通常包含以下几个部分:

  1. 脚本声明: 指明使用的 Shell 类型。
  2. 注释: 对脚本进行解释说明。
  3. 命令: 实际执行的 Shell 命令。

示例脚本如下:

#!/bin/bash
# 这是一个简单的 Shell 脚本示例
echo "Hello, World!"

上述脚本首先声明了使用 bash 作为解释器,然后使用 echo 命令打印了一行文本。

3. 常用 Shell 命令

Shell 提供了许多强大的命令,可以用来执行各种操作。以下是一些常用命令:

  • echo: 输出文本到终端。
  • ls: 列出目录内容。
  • cd: 切换目录。
  • cp: 复制文件或目录。
  • mv: 移动或重命名文件或目录。
  • rm: 删除文件或目录。
  • grep: 搜索文本。
  • awk: 文本处理工具。
  • sed: 流编辑器,用于处理文本。
  • find: 查找文件或目录。
  • chmod: 修改文件权限。
  • chown: 修改文件所有者。
  • tar: 打包和解包文件。
  • curl: 数据传输工具。

4. 变量与注释

在 Shell 脚本中,可以定义变量来存储数据,并使用注释来解释代码。

定义变量

#!/bin/bash
# 定义变量
name="Alice"
# 输出变量内容
echo "Hello, $name"

注释

#!/bin/bash
# 这是单行注释: '
这是
多行
注释
'

5. 条件判断与循环

Shell 脚本中可以使用条件判断和循环结构来控制脚本的执行流程。

条件判断

#!/bin/bash
# 条件判断示例
if [ $1 -gt 10 ]; thenecho "The number is greater than 10."
elseecho "The number is 10 or less."
fi
  • [ ] 是 Shell 的条件判断语法。
  • -gt 表示大于。
  • 其他比较运算符:-lt (小于), -eq (等于), -ne (不等于), -le (小于等于), -ge (大于等于)。

循环结构

#!/bin/bash
# for 循环示例
for i in {1..5}
doecho "Iteration $i"
done# while 循环示例
count=1
while [ $count -le 5 ]
doecho "Count: $count"((count++))
done

6.函数与脚本调试

Shell 脚本支持定义函数,以便在脚本中重复使用代码段。此外,还可以使用调试选项来排查脚本中的错误。

定义函数

#!/bin/bash
# 定义函数
greet() {echo "Hello, $1"
}
# 调用函数
greet "Alice"

脚本调试

可以使用 -x 选项来调试脚本,显示每一条命令执行的详细信息。

#!/bin/bash -x
# 调试模式示例
echo "Debugging mode"

7. Shell 脚本中的输入输出

Shell 脚本中可以处理用户输入和输出,使用 read 命令读取用户输入,使用重定向操作符进行文件输出。

读取用户输入

#!/bin/bash
# 读取用户输入
echo "Enter your name:"
read name
echo "Hello, $name"

文件输出

#!/bin/bash
# 将输出重定向到文件
echo "This is a test" > output.txt

8. Shell 脚本的文件操作

Shell 脚本中可以进行各种文件操作,如创建、读取、写入和删除文件。

创建和写入文件

#!/bin/bash
# 创建并写入文件
echo "Hello, World!" > hello.txt

读取文件内容

#!/bin/bash
# 读取文件内容
while IFS= read -r line
doecho "$line"
done < hello.txt

删除文件

#!/bin/bash
# 删除文件
rm hello.txt

9. 实用脚本示例

以下是一个自动备份目录的脚本示例:

#!/bin/bash
# 自动备份脚本SOURCE_DIR="/path/to/source"
BACKUP_DIR="/path/to/backup"# 创建备份目录
mkdir -p $BACKUP_DIR# 复制文件到备份目录
cp -r $SOURCE_DIR/* $BACKUP_DIR/# 输出备份完成信息
echo "Backup completed successfully."

10. 高级脚本编写技巧

Shell 脚本还可以结合其他工具和技术,编写更为复杂和功能强大的脚本。

使用正则表达式

#!/bin/bash
# 使用 grep 进行正则表达式匹配
echo "Enter a string:"
read input
if [[ $input =~ ^[a-zA-Z]+$ ]]; thenecho "The input is a valid string."
elseecho "The input is not a valid string."
fi

使用数组

#!/bin/bash
# 定义和使用数组
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"
doecho "$fruit"
done

11. 安全性与错误处理

编写 Shell 脚本时,安全性和错误处理非常重要,以避免意外情况和数据丢失。

捕获错误

#!/bin/bash
# 捕获错误
set -e
cp /path/to/source /path/to/destination
echo "Copy completed successfully."

输入验证

#!/bin/bash
# 输入验证
echo "Enter a number:"
read number
if ! [[ "$number" =~ ^[0-9]+$ ]]; thenecho "Error: Not a valid number"exit 1
fi

12. 结论

通过本文的介绍,您应该对 Linux Shell 脚本有了一个全面的了解。从脚本的基本结构到常用命令、变量和注释、条件判断与循环,再到函数和脚本调试、输入输出、文件操作、高级技巧、安全性和错误处理,掌握这些知识将帮助您更高效地编写 Shell 脚本,自动化处理日常任务。

相关文章:

Linux Shell Script 编写入门

Linux Shell 脚本是一种强大的工具&#xff0c;能够帮助用户自动化任务、简化系统管理以及提高工作效率。本文将带您全面了解如何编写 Linux Shell 脚本&#xff0c;并介绍一些常见的脚本编写技巧和注意事项。 目录 什么是 Linux ShellShell 脚本的基本结构常用 Shell 命令变…...

不是从APP store下载的APP在mac上一直提示有损坏,打不开怎么办?

1.点击设置 2.安全与隐私 3.通用看看允许从以下位置下载的APP是否有任何来源 4.如果没有&#xff0c;mac桌面点击&#x1f50d;输入终端或Terminal 命令行输入下述代码&#xff1a; sudo spctl --master-disable 5.回车&#xff0c;输入mac开机密码。注意&#xff1a;此时密…...

ubuntu22.04部署docker版zlmediakit和源码运行wvp-GB28181-pro

1 运行zlmediakit 1. 修改zlmediakit配置文件 先用run命令运行zlmediakit&#xff0c;将zlmediakit的配置文件拷贝出来 docker run -d -p 1935:1935 -p 8080:80 -p 8554:554 \ -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp \ --name zlmediakit \ zlmediakit/zlmedi…...

MySQL表的增删改查初阶(上篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…...

Spring Boot 集成 zxing 生成条形码与二维码

前面我们知道了怎么通过 使用 zxing 生成二维码以及条形码&#xff0c; 由于我们现在都是 web 端的项目了&#xff0c;那么我们看下怎么使用 Spring Boot 集成然后返回给前端展示&#xff1a; 工程源码 对应的工程源码我放到了这里&#xff1a;github源码路径&#xff0c;点击…...

C# 编程基础:注释、变量、常量、数据类型和自定义类型

C# 是一种功能强大的面向对象编程语言&#xff0c;它提供了丰富的特性来帮助开发者编写清晰、高效的代码。本文将介绍C#中的注释、变量、常量、基本数据类型以及如何创建和使用自定义类型。 注释 注释用于解释代码的目的&#xff0c;它们不会被程序执行。 单行注释使用 //。…...

网络原理-三

一、连接管理 建立连接,断开连接 建立连接,TCP有连接的. 客户端执行 socket new Socket(SeverIP,severPort); -> 这个操作就是在建立连接. 上述只是调用socket api,真正建立连接的过程,实在操作系统内核完成的. 内核是怎样完成上述的 " 建立连接 "过程的…...

使用Ollama搭建一个免费的聊天机器人

0 概述 Ollama是一个能在本机运行大语言模型的软件&#xff0c;它提供命令行和API的交互方式&#xff0c;对于需要考虑数据隐私的情景&#xff0c;可以方便的使用Ollama部署大语言模型&#xff0c;并在此基础上开发RAG等应用&#xff0c;而无需调用OpenAI等开放API。Ollama基本…...

计算机网络之快重传和快恢复以及TCP连接与释放的握手

快重传和快恢复 快重传可以让发送方尽早得知丢失消息&#xff0c; 当发送消息M1,M2&#xff0c;M3,M4,M5后,假如消息M2丢失&#xff0c;那么按照算法会发送对M2报文前一个报文M1的重复确认&#xff08;M1正常接受到&#xff0c;已经发送了确认),然后之后收到M4,M5,也会发送两…...

vue 引用第三方库 Swpier轮播图

本文全程干货&#xff0c;没有废话 1.使用 npm 安装 swiper&#xff0c;使用 save 保存到 packjson 中 npm install --save swiper 2、把 swiper看成是第三方库或者是组件&#xff0c;然后按照&#xff0c;引用&#xff0c;挂载组件&#xff0c;使用组件三步法。 3、在 script…...

RabbitMQ-直连交换机(direct)使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 目录 1、概述 2、直连交换机 3、多重绑定 4、具体代码实现 4.1 生产者部分 4.2 消费者部分 5、运行代码 6、总结 1、概述 直连交换机&#xff0c;可以实现类似路由的功能&#xff0c;消息从交换机发送到哪个队列…...

942. 增减字符串匹配 - 力扣

1. 题目 由范围 [0,n] 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s &#xff0c;其中: 如果 perm[i] < perm[i 1] &#xff0c;那么 s[i] I 如果 perm[i] > perm[i 1] &#xff0c;那么 s[i] D 给定一个字符串 s &#xff0c;重构排列 pe…...

2024华为OD机试真题-机器人搬砖-C++(C卷D卷)

题目描述 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头, 要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格, 机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损…...

【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景

目录 一、核心功能 二、优势 三、核心概念 四、工作原理 五、交换机类型 六、消息确认 七、持久性和可靠性 八、插件和扩展 九、集群和镜像队列 十、客户端库 十一、管理界面 十二、应用场景 RabbitMQ是一个基于AMQP协议的消息队列中间件&#xff0c;提供高可用、可…...

Mysql 技术实战篇

命令行 导出 - -h localhost&#xff1a;指定MySQL服务器的主机地址为本地主机。如果MySQL服务器在其他主机上&#xff0c;请将localhost替换为相应的主机地址。 - -u username&#xff1a;指定连接MySQL服务器的用户名。将username替换为您的有效用户名。 - -p&#xff1a;提…...

App自动化测试_Python+Appium使用手册

一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;支持模拟器和真机上的原生应用、混合应用、Web应用&#xff1b;基于Selenium二次开发&#xff0c;Appium支持Selenium WebDriver支持的所有语言&#xff08;java、 Object-C 、 JavaScript 、p hp、 Python等&am…...

k8s-部署对象存储minio

环境信息 minio版本 :最新 k8s 版本1.22 使用nfs作为共享存储 一.单节点安装包部署 脚本部署&#xff0c;一键部署&#xff0c;单节点应用于数据量小&#xff0c;一些缓存存储&#xff0c;比如gitlab-runner的产物数据&#xff0c;maven的打包依赖数据 #!/bin/bash# 步骤…...

go常用命令

创建一个module(逻辑概念) #The go mod init command initializes and writes a new go.mod file in the current directory, in effect creating #a new module rooted at the current directory. #specify a module path that serves as the module’s name. go mod initclon…...

【中年危机】程序猿自救指南

中年危机&#xff0c;一个听起来就充满挑战的词汇&#xff0c;它不仅仅是一个年龄的标记&#xff0c;更是一个个人成长和职业发展的转折点。 构架个人品牌&#xff1a; 学会打造IP个人品牌是职业生涯中的重要资产。在中年时期&#xff0c;你已经积累了丰富的经验和知识&#x…...

vueRouter路由总结

https://blog.csdn.net/qq_24767091/article/details/119326884...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...