Shell脚本的使用

shell

Shell 脚本是一种在 Unix/Linux 操作系统上编写的脚本语言,主要用于自动化执行命令、任务调度以及管理系统。以下是对 Shell 脚本的简要总结:

1. 基础概念

  • Shell 是操作系统提供的一个命令行解释器,常见的 Shell 类型有 Bash(Bourne Again Shell)、Zsh、Sh 等。
  • Shell 脚本 是一组命令的集合,通常保存在 .sh 文件中,可以通过终端执行。

2. 基本语法

  • 注释:以 # 开头的行是注释。注释不会被执行,通常用于解释代码。
    # 这是一个注释
    
  • 变量:可以定义变量,并使用 $ 符号来引用变量。
    name="World"
    echo "Hello, $name!"
    
  • 条件语句
    if [ "$age" -ge 18 ]; thenecho "You are an adult."
    elseecho "You are a minor."
    fi
    
  • 循环
    for i in 1 2 3 4 5; doecho "Number: $i"
    done
    

3. 常用操作

  • 定义和使用函数
    my_function() {echo "This is a function."
    }
    my_function  # 调用函数
    
  • 命令替换:通过反引号 `command`$(command) 可以将命令的输出作为变量。
    current_time=$(date)
    echo "Current time: $current_time"
    
  • 文件操作:使用 cattouchcpmvrm 等命令进行文件的创建、复制、移动、删除等操作。
    touch newfile.txt   # 创建文件
    cat newfile.txt     # 查看文件内容
    

4. 脚本执行

  • 给脚本添加执行权限:
    chmod +x script.sh
    
  • 运行脚本:
    ./script.sh
    

5. 控制流程

  • 条件判断:使用 ifelseelif 来实现条件分支。
  • 循环结构:常见的循环有 forwhileuntil
  • 退出状态码:每个命令执行完后都会返回一个状态码,0 表示成功,非 0 表示失败。可以通过 $? 获取上一个命令的状态码。
    if [ $? -eq 0 ]; thenecho "Success"
    elseecho "Failed"
    fi
    

6. Shell 脚本中的参数

  • $0:脚本名
  • $1$9:传递给脚本的参数
  • $#:传递给脚本的参数个数
  • $@:所有传递给脚本的参数
  • $?:上一个命令的退出状态
echo "Script name: $0"
echo "First argument: $1"
echo "Number of arguments: $#"

7. 调试脚本

  • 使用 set -x 开启调试模式,脚本会显示每条命令的执行过程。
  • 使用 set +x 关闭调试模式。
    set -x
    echo "This is a debug message"
    set +x
    

8. 处理用户输入

  • 使用 read 从用户处获取输入:
    echo "Enter your name:"
    read name
    echo "Hello, $name!"
    

9. 标准输入/输出和重定向

  • >:将输出重定向到文件,覆盖原文件内容。
  • >>:将输出重定向到文件,追加到文件末尾。
  • <:从文件中读取输入。
  • 2>:将标准错误输出重定向到文件。
    echo "This is output" > output.txt   # 输出到文件
    cat < input.txt                      # 从文件读取
    

10. 常用工具

  • awk:文本处理工具,用于对文件或输入流进行格式化处理。
  • sed:流编辑器,用于查找和替换文本。
  • grep:用于文本搜索的工具。

1. awk:文本处理工具

awk 是一个强大的文本处理工具,常用于从文件或输入流中提取、格式化和处理数据。它支持基于模式的搜索、列操作、计算等功能。

基本用法
awk 'pattern { action }' filename
  • pattern:匹配条件
  • action:对匹配的行执行的操作
常见操作
  • 按列打印awk 默认将每行按空格或制表符分割为多个字段,使用 $1 表示第一列,$2 表示第二列,依此类推。

    # 打印第二列
    awk '{ print $2 }' filename
    
  • 按条件筛选:可以通过模式匹配筛选特定行。

    # 打印包含 "error" 的行
    awk '/error/ { print }' filename
    
  • 使用内置变量

    • $0:整行
    • NR:当前记录的行号
    • NF:当前行的字段数
    # 打印行号和每行的第一列
    awk '{ print NR, $1 }' filename
    
  • 计算与格式化输出

    # 计算文件中两列数字的和
    awk '{ sum = $1 + $2; print sum }' filename
    
  • 指定分隔符:使用 -F 选项指定分隔符。

    # 使用逗号作为分隔符
    awk -F "," '{ print $1, $2 }' filename
    
高级示例
# 打印第二列大于100的行
awk '$2 > 100 { print $0 }' filename

2. sed:流编辑器

sed 是一种非交互式的文本处理工具,擅长文本的搜索、替换、删除等操作。

基本用法
sed 'command' filename
常见操作
  • 替换文本:使用 s/查找/替换/ 格式替换文本。

    # 将文件中的 "foo" 替换为 "bar"
    sed 's/foo/bar/' filename
    
  • 全局替换:使用 g 表示全局替换。

    # 将文件中所有的 "foo" 替换为 "bar"
    sed 's/foo/bar/g' filename
    
  • 删除行:使用 d 命令删除匹配的行。

    # 删除包含 "error" 的行
    sed '/error/d' filename
    
  • 在指定位置插入文本

    # 在第二行后插入 "Hello, World!"
    sed '2a Hello, World!' filename
    
  • 指定行进行替换

    # 仅替换第三行的 "foo" 为 "bar"
    sed '3s/foo/bar/' filename
    
高级示例
# 将所有匹配的 "foo" 替换为 "bar",并保存到原文件
sed -i 's/foo/bar/g' filename

3. grep:文本搜索工具

grep 用于在文本中查找符合条件的行,并打印出来,支持正则表达式和多种选项。

基本用法
grep 'pattern' filename
常见操作
  • 匹配并打印行

    # 查找文件中包含 "error" 的行
    grep 'error' filename
    
  • 忽略大小写:使用 -i 忽略大小写。

    grep -i 'error' filename
    
  • 显示行号:使用 -n 选项显示匹配行的行号。

    grep -n 'error' filename
    
  • 递归搜索:使用 -r 在目录中递归搜索。

    grep -r 'error' /path/to/dir
    
  • 统计匹配行数:使用 -c 选项统计匹配的行数。

    grep -c 'error' filename
    
  • 反向匹配:使用 -v 选项输出不匹配的行。

    grep -v 'error' filename
    
正则表达式支持
  • .:匹配任意单个字符
  • *:匹配零个或多个前面的字符
  • ^:匹配行的开始
  • $:匹配行的结束
# 查找以 "start" 开头的行
grep '^start' filename# 查找以 "end" 结尾的行
grep 'end$' filename
高级示例
# 查找多个关键字
grep -E 'error|warning' filename# 查找所有 .log 文件中包含 "failed" 的行
grep 'failed' *.log
  • awk:适合复杂的文本处理和数据操作,如按列打印、计算统计等。
  • sed:擅长查找和替换文本、批量编辑文件等。
  • grep:快速、简单的文本搜索工具,适合查找特定模式、筛选日志等。

这些工具各具特色,经常结合使用,可以大大提高文本处理的效率。

11. 案例示例

  • 批量重命名文件:

    for file in *.txt; domv "$file" "${file%.txt}.bak"
    done
    
  • 自动备份文件:

    backup_dir="/backup"
    mkdir -p "$backup_dir"
    cp -r /home/user/documents "$backup_dir"
    echo "Backup complete!"
    

总结

Shell 脚本在自动化任务中极为有用,尤其是在系统管理、服务器维护、批量任务处理等场景。熟练掌握 Shell 脚本的语法和常用工具,可以显著提升开发和运维效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue全栈开发旅游网项目(11)-用户管理前端接口联调

联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址&#xff1a;src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…

vscode文件重定向输入输出(竞赛向)

VS Code 中文件重定向输入输出 在使用 VS Code 调试或运行 C 程序时&#xff0c;可以使用文件重定向来方便地从文件读取输入并将输出写入文件&#xff0c;而不是修改代码中的 ifstream 和 ofstream。 方法一&#xff1a;在终端中使用文件重定向 假设你的 C 程序文件为 main.…

uniapp vue3的下拉刷新和上拉加载

开启页面的下拉刷新,注意这个不是可滚动视图的下拉刷新. 一般页面建议使用页面外的,不要使用scroll-view里面的下拉刷新. pages: "pages": [ {"path": "pages/index/index","style": {"navigationBarTitleText": "首…

320页PDF | 集团IT蓝图总体规划报告-德勤(限免下载)

一、前言 这份报告是集团IT蓝图总体规划报告-德勤。在报告中详细阐述了德勤为某集团制定的全面IT蓝图总体规划&#xff0c;包括了集团信息化目标蓝图、IT应用规划、数据规划、IT集成架构、IT基础设施规划以及IT治理体系规划等关键领域&#xff0c;旨在为集团未来的信息化发展提…

蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 搜索与查找 一、九宫格 【问题描述】 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三 …

Springboot校园失物招领平台

Springboot校园失物招领平台 Springboot校园失物招领平台

【转】【C#】Windows服务运行exe程序

在“Windows服务”中&#xff0c;上述代码还是可以运行exe程序的&#xff0c;但是我们看不到。在“控制台应用程序”中&#xff0c;我们可以看到被执行的exe程序&#xff0c;但是到了“Windows服务”中&#xff0c;该exe变成了后台执行&#xff0c;无法与用户进行交互。原因如下…

webSocket的使用文档

webSocket的使用文档 1.webSocket介绍2.webSocket使用 1.webSocket介绍 WebSocket是在单个TCP连接上提供全双工通信的协议。它允许双方同时进行数据传输&#xff0c;而不需要等待对方的响应&#xff0c;简单说就是他是服务器和客户端相互主动传输信息的约定协议。 优点&#xf…

C++(Qt)软件调试---符号转换工具cv2pdb (24)

C(Qt)软件调试—符号转换工具cv2pdb &#xff08;24&#xff09; 文章目录 C(Qt)软件调试---符号转换工具cv2pdb &#xff08;24&#xff09;[toc]1、概述&#x1f41c;2、下载cv2pdb&#x1fab2;3、qt程序使用cv2pdb&#x1f9a7;1.1 方法1&#xff1a;命令行1.2 方法2&#…

基于Java Springboot宠物流浪救助系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL…

实战OpenCV之目标检测

基础入门 目标检测是计算机视觉中的一个重要任务,它旨在识别图像或视频帧中的多个对象,并对每个对象进行定位和分类。目标检测任务通常包括以下几个主要步骤。 输入图像:接收一张或多张图像作为输入。 特征提取:从输入图像中提取有用的特征。 候选区域生成:生成一组可能包…

如何在手机上完整下载B站视频并保存到相册?

作为国内最受欢迎的视频平台之一&#xff0c;B站(哔哩哔哩)不仅有丰富的创作者内容&#xff0c;还吸引了大量年轻用户。对于热爱动画、影视剪辑、Vlog等各类视频的观众来说&#xff0c;有时希望能将这些视频下载到手机相册中&#xff0c;方便随时观看或分享。如何在不损失画质的…

uniapp隐藏自带的tabBar

uniapp隐藏自带的tabBar 场景: 微信小程序在使用自定义tabBar组件时, 隐藏uniapp自带的tabBar <template> <!-- index页面 --> </template> <script setup> import { onShow } from /utils/wxUtils onShow(() > {uni.hideTabBar() // 隐藏自带的tab…

My_SQL day3

知识点&#xff1a;约束 1.dafault 默认约束 2.not null 非空约束 3.unique key 唯一约束 4.primary key 主键约束 5.anto_increment 自增长约束 6.foreign key 外键约束 知识点&#xff1a;表关系 1.一对一 2.一对多 3.多对多 知识点&#xff1a;约束 1.default 默认约束 …

C++基础:Pimpl设计模式的实现

2024/11/14: 在实现C17的Any类时偶然接触到了嵌套类的实现方法以及Pimpl设计模式&#xff0c;遂记录。 PIMPL &#xff08; Private Implementation 或 Pointer to Implementation &#xff09;是通过一个私有的成员指针&#xff0c;将指针所指向的类的内部实现数据进行隐藏。 …

从JVM的角度,来分析为什么Java中是值传递?

从 JVM 的角度来看&#xff0c;Java 中的参数传递之所以是值传递&#xff0c;是因为在 JVM 执行方法调用时&#xff0c;参数的值&#xff08;不论是基本类型还是引用类型&#xff09;都被复制并压入调用栈的帧&#xff08;stack frame&#xff09;中。让我们从 JVM 的内存模型和…

Navicat 17 功能简介 | 单元格编辑器

Navicat 17 功能简介 | 单元格编辑器 本期&#xff0c;我们一起了解 Navicat 17 出色的数据操作功能的单元格编辑器。单元格编辑器支持文本、十六进制、图像和网页四种格式的数据编辑&#xff0c;位于底部的编辑器窗格&#xff0c;为你编辑更大容量的数据信息提供足够的显示和操…

Unity自动LOD工具AutoLOD Mesh Decimator的使用

最近在研究大批量物体生成&#xff0c;由于我们没有专业美术&#xff0c;在模型减面工作上没有人手&#xff0c;所以准备用插件来实现LOD功能&#xff0c;所以找到了AutoLOD Mesh Decimator这个插件。 1&#xff0c;导入插件后&#xff0c;我们拿个实验的僵尸狗来做实验。 空…

爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)

目录 一.环境检测 1. 什么是环境检测 2.案例讲解 二 .吐环境脚本 1. 简介 2. 基础使用方法 3.数据返回 4. 完整代理使用 5. 代理封装 6. 封装所有使用方法 jsdom补环境 1. 环境安装 2. 基本使用 3. 添加参数形式 Selenium补环境 1. 简介 2.实战案例 1. 逆向目…

免费,WPS Office教育考试专用版

WPS Office教育考试专用版&#xff0c;不仅满足了考试需求&#xff0c;更为教育信息化注入新动力。 https://pan.quark.cn/s/609ef85ae6d4