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

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脚本
  1. 创建一个脚本文件,例如script.sh

    nano script.sh
    
  2. 在文件中输入脚本内容:

    #!/bin/bash
    echo "Hello, Linux!"
    
  3. 保存并退出文件后,给予执行权限:

    chmod +x script.sh
    
  4. 运行脚本:

    ./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 五、通知&#xff0…...

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…...

国家专精特新小巨人企业指标解析与扶持领域

一、什么是国家专精特新小巨人 (一)概念与定义 专精特新“小巨人”企业是指那些在细分市场中具有专业化、精细化、特色化和新颖化特征的中小企业中的佼佼者。这些企业在创新能力强、市场占有率高、掌握关键核心技术以及质量效益方面表现突出&#xff0…...

进程的属性

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 框架的核心功能,如依赖注入、事件发布和其他应用上…...

原型模式详细介绍和代码实现

🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式 🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言 Java实现原型模式 介绍: 原型模式(Prototype Patte…...

ArcGIS Pro SDK (十三)地图创作 5 图层样式

ArcGIS Pro SDK (十三)地图创作 5 图层样式 文章目录 ArcGIS Pro SDK (十三)地图创作 5 图层样式1 风格管理1.1 如何按名称获取项目中的样式1.2 如何创建新样式1.3 如何向项目添加样式1.4 如何从项目中删除样式1.5 如何将样式项添加到样式1.6 如何从样式中删除样式项1.7 如…...

【Python报错已解决】 Requests.exceptions.ProxyError: HTTPSConnectionPool

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

现在量化中普遍使用QMT和PTrade?哪家可以同时提供QMT/PTrade?

QMT的特点 全面的功能集成: QMT集成了行情显示、策略研究、交易执行和风控管理于一体,为投资者提供了一站式的量化交易解决方案。 高效的交易执行能力: 通过全内存交易实现低延迟的交易执行,单笔延时小于1ms,确保了交易…...

【计算机网络】UDP 协议详解及其网络编程应用

文章目录 一、引言二、UDP1、UDP的协议格式2、UDP 报文的解包和分用3、UDP面向数据报的特点 三、UDP输入输出四、UDP网络编程 一、引言 UDP(User Datagram Protocol,用户数据报协议)是一种网络通信协议,它属于传输层的协议。是一…...

基于ESP32S3的链接大语言模型对话模块

本实物模块从实物外观、模块组成、API申请及功能说明四部分来介绍这款基于ESP32S3的大语言模型对话模块。 1、实物外观 2、模块介绍 本硬件平台主要由三个模块组成,包括MAX9814录音模块、MAX98357音频功放模块和ESP32S3模块。如下图所示。 MAX9814录音模块&#…...

Cpp输出多字符常量警告

Cpp输出多字符常量警告 Cpp中用单引号(single quotes)表示单个字符(single character),例如a,$,用双引号(double quotes)表示字符串文本(text),例如"Hello World! " 当在一个单引号里面存在多个字符时,Cpp…...

Maven从入门到精通(二)

一、什么是pom.xml pom.xml是Maven项目的核心配置文件,它是 项目对象模型 - Project Object Model(POM)的缩写。POM定义了项目的所有属性,包括项目的名称、版本、依赖关系、构建配置等。使用pom.xml,我们可以轻松地管…...

【Kubernetes】常见面试题汇总(二十四)

目录 71.假设一家公司想要修改它的部署方法,并希望建立一个更具可扩展性和响应性的平台。您如何看待这家公司能够实现这一目标以满足客户需求? 72.考虑一家拥有非常分散的系统的跨国公司,期待解决整体代码库问题。您认为公司如何解决他们的问…...

最低成本的游戏串流方案分享 如何自己打造云电脑?

今天教大家如何最低成本实现串流 出门在外也可以随时随地游玩端游大作 硬件准备:一台电脑 手机/平板一台 软件:Gameviewer远程 为啥不用moonlight等其他软件呢 因为设置公网穿透等复杂操作对小白来说不太友好 而GameViewer从安装到使用仅需一键 对比同类…...