Shell脚本的使用

news2024/11/14 1:20:40

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 ]; then
      echo "You are an adult."
    else
      echo "You are a minor."
    fi
    
  • 循环
    for i in 1 2 3 4 5; do
      echo "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 ]; then
      echo "Success"
    else
      echo "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; do
      mv "$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.coloradmin.cn/o/2239801.html

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

相关文章

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系&#xff1b; 平时在dev环境开发时&#xff0c;会把自己的本地服务也注册上去&#xff0c;但是这样的话&#xff0c;在客户端调用时请求可能会打到自己本地&#xff0c;对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…

Go/Golang语言各种数据类型内存字节占用大小和最小值最大值

具体请前往&#xff1a;Go/golang语言基本数据类型字节大小和取值范围(最小值~最大值)

力扣104 : 二叉树最大深度

补&#xff1a;二叉树的最大深度 描述&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 何解&#xff1f; 树一般常用递归&#xff1a;递到叶子节点开始倒着处理

Android GPU纹理数据拷贝

在 Android 开发中读取纹理数据有以下几种方法&#xff1a; glReadPixelsImageReaderPBO&#xff08;Pixel BufferObject&#xff09; HardwareBuffer 1. glReadPixels glReadPixels 是 OpenGL ES 的 API&#xff0c;通常用于从帧缓冲区中读取像素数据&#xff0c;OpenGL ES…

畅捷通T+ RecoverPassword.aspx

用友 畅捷通T RecoverPassword.aspx 存在未授权管理员密码修改漏洞&#xff0c;攻击者可以通过漏洞修改管理员账号密码登录后台 #漏洞影响版本 12.0&#xff0c;12.1.12.2.12.3 13.0 15.0 16.0 18.0 补丁号291都影响 19.0 补丁号167之前也有影响 对于老版本畅捷通已经…

最全最简单理解迭代器

1. 迭代器的基础概念(iterator) 1.1 本质 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。 1.2 作用: 能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。容器提供迭代…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

[CKS] Create/Read/Mount a Secret in K8S

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于读取、创建以及挂载secret的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[C…

docker之容器设置开机自启(4)

命令语法&#xff1a; docker update --restartalways 容器ID/容器名 选项&#xff1a; --restart参数 no 默认策略&#xff0c;在容器退出时不重启容器 on-failure 在容器非正常退出时&#xff08;退出状态非0&#xff09;&#xff0c;才会重启容器 …

机器学习:决策树——ID3算法、C4.5算法、CART算法

决策树是一种常用于分类和回归问题的机器学习模型。它通过一系列的“决策”来对数据进行分类或预测。在决策树中&#xff0c;每个内部节点表示一个特征的测试&#xff0c;每个分支代表特征测试的结果&#xff0c;而每个叶节点则表示分类结果或回归值。 决策树工作原理 根节点&…

Angular 和 Vue2.0 对比

前言 &#xff1a;“业精于勤&#xff0c;荒于嬉&#xff1b;行成于思&#xff0c;毁于随” 很久没写博客了&#xff0c;大多记录少进一步探查。 Angular 和 Vue2.0 对比&#xff1a; 一.概念 1.1 Angular 框架&#xff1a; 是一款由谷歌开发的开源web前端框架&#xff08;核…

Python酷库之旅-第三方库Pandas(208)

目录 一、用法精讲 971、pandas.MultiIndex.set_levels方法 971-1、语法 971-2、参数 971-3、功能 971-4、返回值 971-5、说明 971-6、用法 971-6-1、数据准备 971-6-2、代码示例 971-6-3、结果输出 972、pandas.MultiIndex.from_arrays类方法 972-1、语法 972-2…

[Linux]:IO多路转接之epoll

1. IO 多路转接之epoll 1.1 epoll概述 epoll是Linux内核为处理大规模并发网络连接而设计的高效I/O多路转接技术。它基于事件驱动模型&#xff0c;通过在内核中维护一个事件表&#xff0c;能够快速响应多个文件描述符上的I/O事件&#xff0c;如可读、可写、异常等&#xff0c;…

Spring Security 认证流程,长话简说

一、代码先行 1、设计模式 SpringSecurity 采用的是 责任链 的设计模式&#xff0c;是一堆过滤器链的组合&#xff0c;它有一条很长的过滤器链。 不过我们不需要去仔细了解每一个过滤器的含义和用法,只需要搞定以下几个问题即可&#xff1a;怎么登录、怎么校验账户、认证失败…

API 接口进行多分支管理的方法

原文链接&#xff1a;API 接口进行多分支管理的方法

链表类算法【leetcode】

链表的定义 面试时&#xff0c;需要自己手写... // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 }; 【构造函数可以省略&#xff0c;C默认生成一个构造函数…

重构开发之道,Blackbox.AI为技术注入智能新动力

本文目录 一、引言二、Blackbox.AI实战体验2.1 基于网页界面生成前端代码进行应用开发2.2 与AI助手实现实时智能对话2.3 重塑大型文件交互方式2.4 链接Github仓库进行对话编程 三、总结 一、引言 在生产力工具加速进化的浪潮中&#xff0c;Blackbox.AI开始崭露头角&#xff0c…

【STM32F1】——9轴姿态传感器JY901与IIC通信

【STM32F1】——9轴姿态传感器JY901与IIC通信 一、简介 本篇主要对9轴姿态传感器JY901的调试过程进行总结,实现了以下功能。 IIC通信采集+串口收发:使用STM32F103C8T6的GPIO口模拟IIC,从JY901读取数据,并通过USART1串口发送到PC。二、JY901介绍 电压:3.3-5V量程:X/Z轴 …

Linux网络——自定义协议与序列化

一、协议 协议是一种 " 约定 ". socket api 的接口 , 在读写数据时 , 都是按 " 字符串 " 的方式来发送接收的。如 果我们要传输一些 " 结构化的数据 "&#xff0c;依然可以通过协议。 其实&#xff0c;协议就是双方约定好的结构化的数据。…

Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建

Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建 &#xff08;1&#xff09;虚拟机 ubuntu 要使用桥接模式&#xff0c;不能使用其他模式 &#xff08;2&#xff09;通过网线将PC和开发板网口直连:这样的连接&#xff0c;开发板是无法连接外网的 &#xff08;3&#xff…