news 2026/9/17 7:38:27

Introduction to Bash Scripting 开源电子书:从基础语法到实战自动化的完整学习指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Introduction to Bash Scripting 开源电子书:从基础语法到实战自动化的完整学习指南

Introduction to Bash Scripting 开源电子书:从基础语法到实战自动化的完整学习指南

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

导读

本篇文章围绕开源项目 introduction-to-bash-scripting 展开,这是一本完全免费的 Bash 脚本入门电子书(eBook),以 Markdown 形式维护,面向 DevOps/SysOps 工程师、开发者以及所有 Linux 爱好者。本指南将完整梳理电子书的章节脉络:从 Shebang、变量、输入输出、条件与循环、函数等语言基础,到自定义命令、服务器状态检查脚本、重定向等真实运维场景,并结合仓库中的源码与脚本给出可验证的细节,帮助你快速建立起"用 Bash 脚本组合 Linux 命令、自动化重复性日常任务"的实战能力。

项目概览:一本用 Markdown 维护的开源 Bash 入门书

这个仓库的定位非常清晰:Free Introduction to Bash Scripting eBook。它不依赖复杂的建站工具,全部章节以.md文件存放,主内容位于 ebook/en/content 目录,并按数字前缀排序(000025,外加100收尾章节)。项目同时提供多种语言的翻译版本,如 德语、西班牙语、法语、葡萄牙语、印地语 等,中文读者可以直接阅读英文原版,也可以对照其他语言版本学习。

整个书籍的生成链路由两套工具支撑:

  • Ibis:一个用 PHP 编写的"用 Markdown 写电子书"的工具。配置位于 ebook/en/ibis.php,其中定义了书名(Introduction to Bash Scripting)、作者(Bobby Iliev)、封面图片(cover.jpg)以及生成样章时使用的页面范围(sample配置为第 1~35 页)。这也是 ebook/en/export 目录下 PDF(深色/浅色主题)与 ePub 产物的来源。
  • ShellCheck:仓库提供了 scripts/shellcheck-ebook.sh 脚本,用于自动提取英文电子书 Markdown 文件中的所有bash代码块并逐一运行 ShellCheck 静态检查。脚本默认扫描ebook/en/content目录,并排除了SC2034(变量看似未使用)、SC2154(变量被引用但未赋值)等"教学场景特有"的告警码——因为这些代码块大多是片段,变量常在前一段定义、后一段使用。

也就是说,这本书不仅是"可读的教程",其代码示例本身还经过自动化质量校验,这为读者放心复制粘贴运行提供了保障。

第 1~3 章:Bash 是什么、脚本结构与你第一个 Hello World

Bash 的定义与适用人群

Bash(Bourne-Again SHell)是 Unix 的 shell 和命令语言,也是大多数 Linux 系统默认的命令解释器。它有两种使用形态:在终端中交互式使用,以及像其他编程语言一样编写脚本。书籍的 001-introduction-to-bash.md 给出了一个非常接地气的场景:假如一个项目需要 5 名开发者各自手动配置一遍环境,把这套"又长又重复"的配置流程写成一个脚本,团队成员只需执行一次即可自动完成全部配置——这正是 Bash 脚本的典型价值。

脚本的结构:Shebang 与 .sh 文件

创建脚本只需要一个 Unix 终端和一个文本编辑器(VS Code、vim、nano 均可)。按 002-bash-structure.md 的说明,第一步是创建以.sh结尾的文件:

touch devdojo.sh # 或者直接用编辑器创建 nano devdojo.sh

文件第一行必须指明 bash 可执行文件的绝对路径,这一行被称为Shebang

#!/bin/bash

它的作用是告诉操作系统用/bin/bash来解释这个脚本。不过 bash 并不总在/bin/bash(尤其在某些非 Linux 系统或 bash 作为可选包安装时),因此更稳妥的写法是用envPATH环境变量列出的目录中查找 bash 可执行文件:

#!/usr/bin/env bash

Hello World 的三种执行方式

按 003-bash-hello-world.md,在devdojo.sh中写入:

#!/bin/bash echo "Hello World!"

保存后,先赋予执行权限再运行:

chmod +x devdojo.sh ./devdojo.sh

屏幕上将显示Hello World。除了"赋权后直接执行",还有两种等价方式:

bash devdojo.sh # 显式指定解释器 echo "Hello DevDojo!" # 交互式终端直接执行单条命令

一个值得留意的点是:chmod +x配合 Shebang 是"直接执行"路径的关键;而bash devdojo.sh则完全绕过了 Shebang。把多个命令组合进一个脚本的价值,正是从"交互式单条命令"升级为"一键执行整套流程"。

第 4~7 章:变量、用户输入、注释与位置参数

变量:无数据类型,赋值与引用

004-bash-variables.md 强调:Bash 变量没有数据类型,数字和字符都能存放。赋值用=,且等号前后不能有空格

name="DevDojo" echo "$name" # 输出 DevDojo

书中给出了一个完整的脚本示例:

#!/bin/bash name="DevDojo" echo "Hi there $name"

运行./devdojo.sh输出Hi there DevDojo。逐行拆解:#!/bin/bash指定解释器;name="DevDojo"定义变量;echo "Hi there $name"$引用变量并通过echo输出。脚本行尾不需要分号(加了也不报错,类似 JavaScript)。

引号、花括号与常见的坑

这一章特别强调了三个实用习惯:

  1. 始终用双引号包裹变量"$name")。不加引号时,Bash 会对变量值做词拆分(word splitting)通配符展开(globbing),导致 bug 甚至安全隐患:

    filename="my file.txt" touch $filename # 错误:被拆成 "my" 和 "file.txt" 两个文件 touch "$filename" # 正确:创建一个 "my file.txt" 文件

    唯一常见的例外是[[ ]]测试括号内部——那里不会发生词拆分,但养成引号习惯仍然更好。

  2. 必要时用花括号${name}界定变量名边界。当变量名后面紧跟可能被误认为变量名一部分的字符时,花括号是必须的:

    greeting="Hello" echo "$greetings world" # 错误:Bash 找 $greetings,输出 " world" echo "${greeting}s world" # 正确:输出 "Hellos world"

    数组(${array[0]})、字符串切片(${name:0:3})、默认值(${name:-default})等场景也都依赖花括号。

  3. 脚本外的命令行参数./devdojo.sh Bobby buddy!会传入两个参数,脚本内用$1$2分别引用,$@引用全部参数:

    echo "Hello there $1" # Hello there Bobby echo "Hello there $2" # Hello there buddy! echo "Hello there $@" # Hello there Bobby buddy!

用户输入:read 与 read -p

005-bash-user-input.md 演示了交互式输入。基础写法是先echo提示、再read读取:

#!/bin/bash echo "What is your name?" read name echo "Hi there $name" echo "Welcome to DevDojo!"

更简洁的方式是用read -p,一条命令同时完成"打印提示"和"读取输入":

#!/bin/bash read -p "What is your name? " name echo "Hi there $name" echo "Welcome to DevDojo!"

运行后,脚本会等待你输入名字并按回车,随后输出问候语。

注释:用 # 留给自己和他人的笔记

006-bash-comments.md 说明:以#开头的行是注释,永远不会渲染到屏幕。注释非常适合描述复杂功能,让其他人(以及未来的自己)快速读懂脚本:

#!/bin/bash # Ask the user for their name read -p "What is your name? " name # Greet the user echo "Hi there $name" echo "Welcome to DevDojo!"

位置参数:$1、$2、$@ 与 $0

007-bash-arguments.md 系统讲解了脚本参数。参数在脚本名之后传入,用$1$2$3……按顺序引用,$@引用全部:

#!/bin/bash # arguments.sh echo "Argument one is $1" echo "Argument two is $2" echo "Argument three is $3"

执行与输出:

chmod +x arguments.sh ./arguments.sh dog cat bird # Argument one is dog # Argument two is cat # Argument three is bird

$0则引用脚本自身路径,书中用它实现了一个"自毁脚本"的趣味示例:

#!/bin/bash echo "The name of the file is: $0 and it is going to be self-deleted." rm -f "$0"

运行后脚本会打印自身文件名并删除自己。书中也提醒:自删前务必确认脚本已备份。

第 8 章:数组与切片

008-bash-arrays.md 指出,与普通变量不同,数组可以在一个名字下保存多个值。初始化时用空格分隔、整体用()包裹:

my_array=("value 1" "value 2" "value 3" "value 4")

访问元素必须使用花括号 + 双引号

echo "${my_array[1]}" # 输出 value 2(索引从 0 开始) echo "${my_array[-1]}" # 输出 value 4(最后一个元素) echo "${my_array[@]}" # 输出全部元素:value 1 value 2 value 3 value 4 echo "${#my_array[@]}" # 输出元素个数:4

数组切片与字符串切片

Bash 本身不支持真正的数组切片,但可以用索引范围模拟(需要 Bash 4.0+):

array=("A" "B" "C" "D" "E") echo "${array[@]}" # A B C D E echo "${array[1]}" # B echo "${array[@]:1:3}" # B C D(从索引 1 开始取 3 个) echo "${array[@]:3}" # D E(从索引 3 到末尾)

字符串切片的语法是${string:start:length}start从 0 计数,length表示最多提取的字符数(而非结束索引,这与 Python 不同):

text="ABCDE" echo "${text:0:2}" # AB echo "${text:3}" # DE echo "${text:1:3}" # BCD echo "${text:3:3}" # DE(只剩 2 个字符,自动在末尾停止)

即便指定的长度超出剩余字符,Bash 也不会报错,只会返回可用的部分——这在处理长度不确定的字符串时很实用。

第 9~10 章:条件表达式与 if/case 语句

常用条件表达式速查

009-bash-conditional-expressions.md 提供了一份"不用背、随时查"的表达式清单,全部基于[[ ]]复合命令([内建命令也可用):

文件表达式file代表待测试的文件路径):

表达式含义
[[ -a ${file} ]]文件存在
[[ -b ${file} ]]存在且为块设备文件
[[ -c ${file} ]]存在且为字符设备文件
[[ -d ${file} ]]存在且为目录
[[ -e ${file} ]]文件存在
[[ -f ${file} ]]存在且为普通文件
[[ -h ${file} ]]/[[ -L ${file} ]]存在且为符号链接
[[ -r ${file} ]]存在且可读
[[ -s ${file} ]]存在且大小大于 0
[[ -w ${file} ]]存在且可写
[[ -x ${file} ]]存在且可执行

字符串表达式

表达式含义
[[ -v varname ]]变量varname已被赋值(注意传变量名而非${varname}
[[ -z ${string} ]]字符串长度为 0
[[ -n ${string} ]]字符串长度非 0
[[ ${string1} == "${string2}" ]]两字符串相等
[[ ${string1} != "${string2}" ]]两字符串不相等
[[ ${string1} < ${string2} ]]string1 按字典序排在 string2 之前
[[ ${string1} > ${string2} ]]string1 按字典序排在 string2 之后

提醒:在[[ ]]中,==/!=右侧默认被当作通配符模式,除非用引号包裹。想做精确字符串比较,务必写== "${string2}"

算术运算符arg1arg2可为正负整数):

表达式含义
[[ ${arg1} -eq ${arg2} ]]相等
[[ ${arg1} -ne ${arg2} ]]不相等
[[ ${arg1} -lt ${arg2} ]]小于
[[ ${arg1} -le ${arg2} ]]小于等于
[[ ${arg1} -gt ${arg2} ]]大于
[[ ${arg1} -ge ${arg2} ]]大于等于

组合与退出状态:用&&表示 AND、||表示 OR;[[ $? -eq 0 ]]判断上一条命令成功(退出码 0),[[ $? -gt 0 ]]判断失败。

if / if-else / elif / case

010-bash-conditionals.md 将上面的表达式接入标准条件语句。if的格式是:

if [[ some_test ]] then <commands> fi

一个检查"用户是否输入了名字"的例子:

#!/bin/bash read -p "What is your name? " name if [[ -z ${name} ]] then echo "Please enter your name!" else echo "Hi there ${name}" fi

管理员判断与"禁止以 root 运行"是书中的两个高频场景。前者用字符串比较,后者利用$EUID(当前有效用户 ID),若为 0 则直接退出脚本:

#!/bin/bash admin="devdojo" read -p "Enter your username? " username if [[ "${username}" == "${admin}" ]] ; then echo "You are the admin user!" else echo "You are NOT the admin user!" fi
#!/bin/bash if (( $EUID == 0 )); then echo "Please do not run as root" exit fi

多条件判断可以用&&/||组合,也可以用elif处理多分支:

#!/bin/bash read -p "Enter a number: " num if [[ $num -gt 0 ]] ; then echo "The number is positive" elif [[ $num -lt 0 ]] ; then echo "The number is negative" else echo "The number is 0" fi

当分支很多时,case语句比一长串if-else更清晰。其语法要点:以case开始、esac(case 倒写)结束;in后面跟模式;每个模式以)结尾;多个模式用|分隔;每个分支以;;终止;*作为默认分支:

#!/bin/bash read -p "Enter the name of your car brand: " car case $car in Tesla) echo -n "${car}'s car factory is in the USA." ;; BMW | Mercedes | Audi | Porsche) echo -n "${car}'s car factory is in Germany." ;; Toyota | Mazda | Mitsubishi | Subaru) echo -n "${car}'s car factory is in Japan." ;; *) echo -n "${car} is an unknown car brand" ;; esac

第 16 章"交互式菜单"(016-creating-an-interactive-menu-in-bash.md)正是用case处理用户输入的真实例子,可见这一语法在实战中的地位。

第 11 章:循环——for、while、until 与 continue/break

011-bash-loops.md 覆盖了 Bash 的三种循环与两个控制关键字。

for 循环

遍历数组元素:

#!/bin/bash users=("devdojo" "bobby" "tony") for user in "${users[@]}" do echo "$user" done

要点:for关键字定义循环变量(这里是user),"${users[@]}"展开全部数组元素(双引号保证含空格的元素不被拆分),do表示每轮迭代要执行的内容,done关闭循环。

遍历数字序列(花括号展开{1..10}):

#!/bin/bash for num in {1..10} do echo "$num" done

while 循环

结构与for相似,只要条件为真就持续执行:

#!/bin/bash counter=1 while [[ $counter -le 10 ]] do echo "$counter" ((counter++)) done

((counter++))是算术自增写法,配合-le 10条件确保循环恰好执行 10 次。书中还用 while 实现了"不允许空输入"的校验逻辑:

#!/bin/bash read -p "What is your name? " name while [[ -z ${name} ]] do echo "Your name can not be blank. Please enter a valid name!" read -p "Enter your name again? " name done echo "Hi there ${name}"

until 循环

untilwhile相反:条件变为真之前一直执行。同样可以输出 1 到 10:

#!/bin/bash count=1 until [[ $count -gt 10 ]] do echo "$count" ((count++)) done

continue 与 break

  • continue [n]:跳过本轮剩余命令,进入下一轮迭代;n可选(≥1),表示恢复第 n 层外层循环,continue 1等价于continue
  • break [n]:立即结束循环;n表示退出第 n 层外层循环,break 1等价于break

两个经典示例:

#!/bin/bash for i in 1 2 3 4 5 do if [[ $i -eq 2 ]] then echo "skipping number 2" continue fi echo "i is equal to $i" done
#!/bin/bash num=1 while [[ $num -lt 10 ]] do if [[ $num -eq 5 ]] then break fi ((num++)) done echo "Loop completed"

嵌套循环中用break 2可以直接跳出外层循环:

#!/bin/bash for (( a = 1; a < 10; a++ )) do echo "outer loop: $a" for (( b = 1; b < 100; b++ )) do if [[ $b -gt 5 ]] then break 2 fi echo "Inner loop: $b " done done

当内层b超过 5 时,break 2会同时跳出内外两层循环;如果换成break,则只跳出内层。

第 12 章:函数——复用代码的基本单元

012-bash-functions.md 给出了两种等价定义方式:

function function_name() { your_commands } # 或者省略 function 关键字 function_name() { your_commands }

调用时不要加括号

#!/bin/bash function hello() { echo "Hello World Function!" } hello

向函数传参的方式与向脚本传参完全一致,函数内部用$1引用第一个参数:

#!/bin/bash function hello() { echo "Hello $1!" } hello DevDojo

书中还推荐了一种"带注释头"的函数风格:在函数上方写明 Description(描述)、Globals(用到的全局变量)、Arguments(参数)、Outputs(输出)、Returns(返回值约定,0 成功、非 0 出错),方便团队协作与长期维护。

第 13 章:调试、测试与终端快捷键

013-debugging-and-testing.md 提供了两条调试路径:

  • -x追踪执行bash -x ./your_script.sh会打印每一条被执行的命令;也可以在脚本中某处插入set -x开启该模式,之后的命令都会回显到终端。
  • ShellCheck 静态检查:在线粘贴到 shellcheck.net,或在本机安装 shellcheck 后直接运行。仓库为此专门提供了 scripts/shellcheck-ebook.sh 自动化脚本——它解析ebook/en/content下所有 Markdown,提取```bash代码块,写入临时文件并逐个执行shellcheck -S warning -e "$EXCLUDE",最后汇总输出"Checked X bash code blocks across Y markdown files",有告警则以退出码 1 结束。这说明书中的代码示例本身经受住了静态检查的考验。

此外该章还整理了终端高频快捷键:Ctrl + k(删除光标到行尾)、Ctrl + u(删除光标到行首)、Ctrl + w(向前删除一个词)、Ctrl + r(反向搜索历史命令)、Ctrl + l(清屏)、Ctrl + s/Ctrl + q(暂停/恢复屏幕输出)、Ctrl + c(终止当前命令)、Ctrl + z(把当前命令放入后台)。

第 14 章:创建自定义 Bash 命令(别名)

014-creating-custom-bash-commands.md 针对"长命令重复输入"的痛点给出别名方案。典型场景:排查服务器 80/443 端口连接数,长命令如下:

netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l

alias将其压缩为短命令conn

alias conn="netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l"

还可以加上提示信息:

alias conn="echo 'Total connections on port 80 and 443:' ; netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l"

直接运行conn即可得到类似输出:

Total connections on port 80 and 443: 12

持久化:别名默认在退出登录后丢失,需写入 shell 配置文件(Ubuntu 上是~/.bashrc,其他系统可能是~/.bash_profile):

nano ~/.bashrc # 在文件末尾追加 alias conn="echo 'Total connections on port 80 and 443:' ; netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l"

查看所有别名:直接运行alias即可列出当前 shell 的全部别名——当某些命令行为异常时,这有助于排查是否被别名覆盖。

书中还对比了"别名 vs 把脚本放进/usr/bin"两种方案:后者需要 root/sudo 权限,而别名无需任何特权即可生效。

第 15 章:实战——你的第一个服务器状态检查脚本

015-writing-your-first-bash-script.md 把前 14 章的知识点串成一个完整的运维脚本,目标输出四类信息:磁盘使用、CPU 负载、内存使用、内核版本。

规划好功能后,先创建status.sh,依次加入 Shebang、注释、变量与函数。值得注意的命令替换写法:用$()让 Bash 先执行命令再把结果赋给变量——

server_name=$(hostname)

随后定义函数:内存检查用free -h,CPU 检查用uptime,TCP 连接数读取/proc/net/tcp并用wc -l计数,内核版本用uname -r。完整脚本如下:

#!/bin/bash ## # BASH script that checks: # - Memory usage # - CPU load # - Number of TCP connections # - Kernel version ## server_name=$(hostname) function memory_check() { echo "" echo "Memory usage on ${server_name} is: " free -h echo "" } function cpu_check() { echo "" echo "CPU load on ${server_name} is: " echo "" uptime echo "" } function tcp_check() { echo "" echo "TCP connections on ${server_name}: " echo "" wc -l < /proc/net/tcp echo "" } function kernel_check() { echo "" echo "Kernel version on ${server_name} is: " echo "" uname -r echo "" } function all_checks() { memory_check cpu_check tcp_check kernel_check } all_checks

执行chmod +x status.sh && ./status.sh即可一次性看到主机名、内存、负载、TCP 连接数与内核版本。这个示例同时体现了本书反复强调的核心方法论:用函数把单条 Linux 命令组织成可复用的检查单元,再通过一个汇总函数统一调度

第 23 章:重定向与管道——深入文件描述符

023-bash-redirection.md 是进阶到"Linux 超级用户"必备的知识。核心概念是文件描述符(fd):Linux 有 3 个标准描述符——STDIN(0)管理终端输入、STDOUT(1)管理正常输出、STDERR(2)管理错误输出。重定向处理"进程与文件的流",而管道把第一个命令的输出接到第二个命令的输入。

STDIN 与 heredoc

cat不加参数时会等待 STDIN。用 heredoc 可以一次性传入多行文本:

cat << EOF Hello World! How are you? EOF

配合wc -l可以统计行数:

wc -l << EOF Hello World! How are you? EOF # 输出 2

STDOUT:> 与 >>

>把输出写入文件(覆盖旧内容),>>追加。注意>每次都会清空重写:

echo "Hello World!" > file.txt echo "How are you?" > file.txt cat file.txt # 只剩 How are you?

改用>>即可保留两行。显式写法是1>

echo "Hello World!" 1> file.txt

STDERR:2> 与 /dev/null

错误信息用2>重定向:

ls --hello 2> error.txt

不需要的错误输出可以丢弃到伪设备/dev/null

ls --hello 2> /dev/null

同时重定向 STDOUT 与 STDERR 的三种等价写法:

./install_package.sh > output.txt 2> error.txt # 分文件 ./install_package.sh > file.txt 2> file.txt # 同文件(不推荐,可能交错) ./install_package.sh > file.txt 2>&1 # 同文件(推荐,先重定向 1 再合并 2)

管道

|将一个命令的输出作为下一个命令的输入,可任意串联。经典组合:列出当前目录并过滤.txt文件——

ls | grep ".txt"

书中还给出了一个"统计目录下各用户拥有的文件数"的复合管道:

ls -l /projects/bash_scripts | tail -n +2 | sed 's/\s\s*/ /g' | cut -d ' ' -f 3 | sort | uniq -c

输出形如:

8 anne 34 harry 37 tina 18 ryan

Heredoc 与 HereString

heredoc(<<)适合把多行内容"临时文件化"后送入命令,分隔符可以是任意字母数字词(不限于EOF),内部还能使用预定义变量;herestring(<<<)则用于单行字符串:

cat << randomword1 This script will print these lines on the terminal. randomword1 wc <<<"this is an easy way of passing strings to the stdin of a program (here wc)"

重定向/管道操作符速查表

操作符说明
>将输出保存到文件
>>将输出追加到文件
<从文件读取输入
2>重定向错误信息
\|把一个程序的输出作为另一个程序的输入
<<干净地把多行内容送入程序
<<<干净地把单行内容送入程序

如何继续深入阅读与使用这本书

  1. 在线阅读全部章节:英文原版从 000-about-the-author.md 开始,到 100-bash-wrap-up.md 结束;每个章节都是独立 Markdown,可直接在仓库中阅读,也便于按需检索。
  2. 下载成品 PDF/ePub:仓库已预生成 深色主题 PDF、浅色主题 PDF 和 ePub,另有对应 sample 版本。
  3. 复现构建(可选):项目使用 Ibis 从 Markdown 生成 PDF/ePub,配置见 ebook/en/ibis.php;若想检验书中代码质量,可在安装 shellcheck 后运行./scripts/shellcheck-ebook.sh
  4. 对照学习多语言版本:除英文外还有德语(ebook/de/content)、西班牙语(ebook/es/content)、法语(ebook/fr/content)、葡萄牙语(ebook/pt_br/content)与印地语(ebook/hi/content)等目录,适合作为语言与技能同步提升的素材。

总结

#!/bin/bash到管道与重定向,introduction-to-bash-scripting 用 20 余章、由浅入深地构建了一条完整的 Bash 学习路径:前 13 章夯实语言基础(结构、变量、输入、参数、数组、条件、循环、函数、调试),后续章节全部围绕真实场景展开(自定义命令、状态检查脚本、多服务器执行、jq 处理 JSON、Cloudflare API、日志解析、邮件发送、密码生成器、重定向等),并且配套了 ShellCheck 自动化校验与多语言版本。无论你是 DevOps/SysOps 工程师、开发者还是 Linux 爱好者,都可以把它当作一本可随时查阅、可复现运行的"Bash 自动化手册",把重复劳动交给脚本,把时间留给更有价值的事。

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 7:38:15

信创环境下DevOps研运一体化实践与优化

1. 研运一体化的发展背景与行业痛点2026年研发运营一体化&#xff08;DevOps&#xff09;将进入深水区&#xff0c;企业级CICD平台面临两大核心挑战&#xff1a;信创环境适配与超大规模研发协同。根据Gartner最新报告&#xff0c;到2026年75%采用DevOps的企业将遭遇工具链与国产…

作者头像 李华
网站建设 2026/9/17 7:37:11

Windows下配置Git多平台SSH密钥:GitHub、GitLab、Gitee三套环境共存

1. 为什么要在Windows上同时配置三套Git环境1.1 三个平台并存&#xff0c;才是开发者的日常如果你只是偶尔往GitHub传点代码&#xff0c;那今天这篇你大概率用不上。但只要你经历过公司项目、个人开源、国内托管三线作战&#xff0c;你很快就会意识到一件事&#xff1a;电脑上只…

作者头像 李华
网站建设 2026/9/17 7:36:36

用Qt开发AI文章生成器:豆包API接入与桌面应用实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 7:35:12

闪存多通道并发如何引发DDR聚合压力

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 7:35:08

远距离CAN总线光纤组网四大方案选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 7:33:53

小爱音箱变身免费本地音乐库:XiaoMusic 部署与使用指南

小爱音箱变身免费本地音乐库&#xff1a;XiaoMusic 部署与使用指南 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic "小爱同学&#xff0c;播放周杰伦的《七里香…

作者头像 李华