首页 > 其他分享 >每个工程师都应知道的 10 个 Bash 脚本结构【转】

每个工程师都应知道的 10 个 Bash 脚本结构【转】

时间:2025-01-06 16:55:58浏览次数:1  
标签:脚本 10 log 工程师 echo report final Bash

每个工程师都应知道的 10 个 Bash 脚本结构

工程师掌握 Bash:10 个结构统治一切

Bash 脚本是工程师的超能力。无论是自动化重复任务、连接工具还是管理系统,Bash 总是简单而强大。

但就像任何力量一样,它需要掌握。让我通过一个可能的场景,带您了解 10 个关键的 Bash 结构。

场景

您需要分析来自多个文件的服务器日志,提取失败的登录尝试,并生成报告。这是一个常规问题,但通过 Bash,我们将使其优雅且可重用。

1. 用脚本设置舞台

我们通过编写脚本框架开始我们的旅程:

#!/bin/bash

set -e # 遇到错误时退出
trap 'echo "错误在第 $LINENO 行"; exit 1' ERR

为什么?:

  • set -e 确保脚本在遇到第一个问题时停止。
  • trap 捕获错误,为我们提供有用的调试信息。

2. 使用函数模块化

好的脚本是模块化的。让我们定义一个函数来解析日志文件:

parse_logs() {

local file="$1"
local output="$2"

whileread -r line; do
    if [[ "$line" == *"FAILED LOGIN"* ]]; then
        echo"$line" >> "$output"
    fi

done < "$file"
}

为什么?:

  • 函数使脚本可重用且易于维护。
  • local变量防止意外覆盖。

3. 数组:管理多个日志

我们需要处理来自多个服务器的日志:

log_files=("server1.log" "server2.log" "server3.log")
results=()

for file in "${log_files[@]}"; do
    output="${file%.log}_failed.log"
    parse_logs "$file" "$output"
    results+=("$output")
done

为什么?:

  • 数组帮助高效管理项目列表。
  • 我们将处理后的结果附加到数组中以供后续步骤使用。

4. 命令替换:添加时间戳

让我们使用date 为输出文件添加时间戳:

timestamp=$(date "+%Y-%m-%d")
final_report="failed_logins_$timestamp.txt"

为什么?:

  • 命令替换无缝地将动态值集成到脚本中。

5. 字符串操作

在合并日志之前,我们清理输出文件名:

for file in "${results[@]}"; do
    sanitized_name="${file// /_}"  # 将空格替换为下划线
    mv "$file" "$sanitized_name"
done

为什么?:

  • Bash 的参数扩展简化了字符串转换,无需外部工具。

6. 进程替换:合并文件

高效合并日志:

cat "${results[@]}" > "$final_report"

为什么?:

  • 进程替换和数组扩展使处理多个文件简洁高效。

7. 条件逻辑:定制报告

根据内容定制最终报告:

if [[ -s "$final_report" ]]; then
    echo "报告已生成: $final_report"
else
    echo "未找到失败的登录。"
    rm "$final_report"
fi

为什么?:

  • if 确保操作依赖于上下文,例如报告是否为空。

8. 案例语句:默认端口

假设我们需要根据服务器类型识别默认的 SSH 和 HTTPS 端口:

get_port() {
    local server="$1"
    case "$server" in
        "prod"*) echo 22 ;;
        "staging"*) echo 2222 ;;
        *) echo 80 ;;
    esac
}

为什么?:

  • case 优雅地处理多个特定模式。

9. 使用set -x 调试

在部署脚本之前,让我们调试它:

set -x # 启用调试
# 在此运行主脚本
set +x # 禁用调试

为什么?:

  • 调试工具如set -x 使跟踪和修复错误变得容易。

10. 文件描述符用于高级 I/O

假设我们从特殊输入流读取和处理日志:

exec 3<"$final_report"

while read -u3 line; do
    echo "已处理: $line"
done

exec 3<&-

为什么?:

  • 文件描述符提供对输入输出的精确控制,支持并行处理。

最终脚本

以下是打磨后的脚本可能的样子:

#!/bin/bash

set -e
trap'echo "错误在第 $LINENO 行"; exit 1' ERR
parse_logs() {
    local file="$1"
    local output="$2"
    whileread -r line; do
        if [[ "$line" == *"FAILED LOGIN"* ]]; then
            echo"$line" >> "$output"
        fi
    done < "$file"
}
log_files=("server1.log""server2.log""server3.log")
results=()
for file in"${log_files[@]}"; do
    output="${file%.log}_failed.log"
    parse_logs "$file""$output"
    results+=("$output")
done
timestamp=$(date "+%Y-%m-%d")
final_report="failed_logins_$timestamp.txt"
cat "${results[@]}" > "$final_report"
if [[ -s "$final_report" ]]; then
    echo"报告已生成: $final_report"
else
    echo"未找到失败的登录。"
    rm "$final_report"
fi

收获

这个脚本结合了工程师在专业 Bash 脚本中几乎需要的所有内容:模块化、错误处理、高效数据处理和调试工具。

通过掌握这些结构,您不仅会编写更好的脚本,还会将平凡的任务转化为优雅的解决方案。

但是,还有一件事(也许是 5 件)。我现在太兴奋了,我会再包含 5 个我经常使用的额外内容:

每个工程师都应知道的 5 个额外 Bash 结构

以下是五个额外的结构:

1. 关联数组

它们是什么: 关联数组是 Bash 中的键值对,从 Bash 4 开始可用。它们允许高效查找和数据组织。

示例: 假设您正在将服务器名称映射到其 IP 地址:

declare -A servers

servers=( ["web"]="192.168.1.10" ["db"]="192.168.1.20" ["cache"]="192.168.1.30" )

# 访问值
echo "Web 服务器 IP: ${servers[web]}"
# 遍历键
for key in "${!servers[@]}"; do
    echo "$key -> ${servers[$key]}"
done

为什么使用它们:

  • 关联数组提供了一种自然的方式来处理结构化数据,无需依赖外部工具如awk 或sed
  • 适用于配置、查找和在脚本中动态组织数据。

2. 使用 Heredocs 进行多行输入

它们是什么: Heredocs 允许在脚本中直接输入多行字符串或数据,提高处理模板或批量数据时的可读性。

示例: 动态生成电子邮件模板:

email_body=$(cat <<EOF
Hello Team,

This is a reminder for the upcoming deployment at midnight.

Regards,
DevOps
EOF)

echo "$email_body" | mail -s "Deployment Reminder" team@example.com

为什么使用它们:

  • 它们消除了复杂字符串连接或外部文件的需求。
  • Heredocs 简化了直接在脚本中处理多行内容,如日志、模板或命令。

3. 使用eval 进行动态命令执行

它是什么:eval 命令允许您将动态构造的字符串作为 Bash 命令执行。

示例: 假设您需要执行存储在变量中的命令:

cmd="ls -l"
eval "$cmd"

或动态设置变量:

var_name="greeting"
eval "$var_name='Hello, World!'"
echo "$greeting"

为什么使用它:

  • eval 提供了处理动态生成命令或输入的灵活性。
  • ⚠ 谨慎使用:虽然强大,但不当使用eval 可能会带来安全风险,尤其是在处理不受信任的输入时。

4. 子 shell 用于隔离执行

它们是什么: 子 shell 是执行命令而不影响父 shell 的子进程。

示例: 假设您想临时更改目录并执行命令:

(current_dir=$(pwd)
cd /tmp
echo "Now in $(pwd)"
)
echo "Back in $current_dir"

为什么使用它们:

  • 子 shell 允许临时更改变量、环境或目录,而不会影响主 shell。
  • 适用于运行不会污染或修改父环境的隔离操作。

5. 命名管道(FIFOs)

它们是什么: 命名管道(或 FIFOs)是特殊文件,通过充当命令之间的缓冲区来促进进程间通信。

示例: 让我们创建一个命名管道在进程之间传输数据:

mkfifo my_pipe

# 在一个终端:写入管道
echo "Hello from process 1" > my_pipe

# 在另一个终端:从管道读取
cat < my_pipe

# 清理
rm my_pipe

为什么使用它们:

  • 命名管道支持进程之间的异步通信,无需临时文件。
  • 适用于实时处理场景,如在命令之间传输日志或流数据。

结论

这些额外的结构——关联数组、Heredocs、eval、子 shell 和命名管道——扩展了您的 Bash 脚本工具包,以应对更复杂的任务。

通过掌握这些结构,您将编写更优雅、高效且易于维护的脚本,以应对实际的工程挑战。

祝您编写愉快!

标签:脚本,10,log,工程师,echo,report,final,Bash
From: https://www.cnblogs.com/paul8339/p/18655692

相关文章

  • (2024最新毕设合集)基于Django的电影资讯共享平台-10223|可做计算机毕业设计JAVA、PHP、
    目录摘要Abstract1绪论1.1研究背景1.2研究意义1.3论文结构与章节安排2电影资讯共享平台系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3 社会可行性2.1.4法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.......
  • Bash Shell的操作环境
    目录1、路径与指令搜寻顺序2、bash的进站(开机)与欢迎信息:/etc/issue,/etc/motd(1)/etc/issue(2)/etc/motd 3、bash的环境配置文件(1)login与non-loginshell(2)/etc/profile(loginshell才会读取)(3) ~./bash_profile(loginshell才会读取)(4)source:读入环境配置文件的指令(5)~/.ba......
  • Rad Studio 10.2.3 Tokyo 3231(DELPHI 10.2)官方ISO/百度云盘 下载地址
    Embarcadero希望通过RADStudio的最新版本帮助程序员更快地构建跨平台的本机应用程序。据悉,RADStudio10.2是一个具有Linux支持,改进的IDE菜单,新功能和增强的C++性能的版本。新版本支持基于LLVM的Linux编译器便于企业开发。DelphiLinux编译器能够帮助程序员采用新的和现有的W......
  • 数据安全性超强的10个项目管理工具
    在当今数字化时代,数据安全性已成为项目管理工具选择中的关键因素。无论是企业内部项目还是跨团队协作,确保敏感信息的安全性至关重要。本文将介绍10个数据安全性最强的项目管理工具,帮助您在选择工具时做出明智的决策。禅道项目管理软件禅道项目管理软件是一款专为中国市场设计的......
  • IT软件研发行业备受欢迎的10个项目管理工具
    在当今快速发展的IT行业中,项目管理软件已经成为团队协作和项目成功的关键工具。无论是初创公司还是大型企业,选择合适的项目管理软件都能显著提升工作效率、优化资源分配并确保项目按时交付。本文将介绍10款在IT行业中备受推崇的项目管理软件,帮助您找到最适合自己团队需求的解决方......
  • win10重装如何跳过微软账号直接设置本地帐户.221111
    ​在添加你的帐户界面,选择脱机帐户2.第二个页面,选择有限的体验3.第三个页面,设置自己本地的用户名4.第四个页面,设置自己本地的密码......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-10- 标签页(tab)操作 - 上篇 (详细教
    1.简介本来按照计划这一系列的文章应该介绍Context和Page两个内容的,但是宏哥看了官方文档和查找资料发现其实和宏哥在Python+Playwright系列文章中的大同小异,差不了多少,再在这一个系列介绍就有点画蛇添足,索性就不介绍和讲解了,有兴趣的自己可以看宏哥之前写的,或者自己查找资料和官......
  • 电脑盲如何选购笔记本避免被坑?很简单,不用别人教你也能搞定.240108
     经常有人问伟哥,笔记本电脑该如何选购。其实很简单,一是看预算,二是到某东看预算范围内的热销电脑,闭眼选就是。笔记本现在也是消费品了,没那么多讲究。 当然,如果要显得你自己更加专业或更加有逼格一点,那,在笔记本选购中,要注意两点:CPU和硬盘。 硬盘很好说,现在这时代,一定是固态......
  • docker部署最新6.2版Zabbix Server端.240103
    一、安装docker,参见本博客docker安装文档。二、启动空的mysql-eMYSQL_DATABASE="zabbix"\-eMYSQL_USER="zabbix"\-eMYSQL_PASSWORD="zabbix_pwd1234"\-eMYSQL_ROOT_PASSWORD="root_pwd12345"\-p3306:3......
  • 云计算真的很便宜吗?.240103
    ​37Signals的首席技术官DavidHeinemeierHansson表示,2022年一共在AWS(亚马逊云)花了3,201,564美元,即每月266,797美元。其中759,983美元都花费在AWS的EC2和EKS服务服务计算上面。Heinemeier指出,即使是这个账单,也是团队共同努力保持costdown的结果。“这已经是一个高度优化的预算!......