资讯详情

devops-exercises 仓库实战解析:用 Bash 算术展开与条件短路实现“因子检测“脚本(Factors)

📅 2026/10/2 21:09:22 | 华诺云谱 👁 阅读
devops-exercises 仓库实战解析:用 Bash 算术展开与条件短路实现“因子检测“脚本(Factors)
文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载导读factors.md是 devops-exercises 仓库中 Shell Scripting 练习系列位于 topics/shell/factors.md的算术Arithmetic主题题目其官方参考解在 topics/shell/solutions/factors.md。题目要求给定一个数字检测其是否以 2 或 3 为因子并输出对应提示文本当 2、3 均不是因子时则原样打印该数字本身。本篇将逐行拆解这份只有 4 行核心代码的精巧解法讲透 Bash 算术展开((...))、/||短路求值、字符串拼接以及${var:-default}参数展开等关键语法并结合仓库中其他同系列练习与实测输出帮助你彻底掌握这一类用 Bash 表达式代替 if 语句的写法可复制、可运行、可直接迁移到日常脚本中。一、练习目标三句话讲清需求题目原文topics/shell/factors.md明确要求编写一个脚本当给它传入一个数字时检测该数字是否有因子 2若有则打印one factor检测该数字是否有因子 3若有则打印one factor...actually two!若 2 和 3 都不是它的因子则打印该数字本身。注意需求是叠加而非互斥一个数字可能同时被 2 和 3 整除例如 6、12此时两行提示应同时成立最终输出合并结果。整个练习在 topics/shell/README.md 的练习索引表中被归类为Arithmetic算术主题难度标注为Basic基础与 Variables、Conditionals、For Loops、Functions 等练习共同构成仓库的 Shell 脚本入门训练链。二、官方参考解四行代码的精妙之处仓库给出的参考解全文如下topics/shell/solutions/factors.md#!/usr/bin/env bash (( $1 % 2 )) || resone factor (( $1 % 3 )) || res...actually two! echo ${res:-$1}去掉 shebang 后真正参与逻辑的只有 3 行。要把这份解法真正读懂、能复述、能举一反三需要先理解它背后四个语法点下面逐一展开。1. shebang为什么是#!/usr/bin/env bash脚本首行#!/usr/bin/env bash是 shebang。仓库 topics/shell/README.md 的自测题中专门解释过/bin/bash是 Linux 系统最常见的登录默认 shellBashBourne-again shell功能丰富、语法完善、可执行绝大多数脚本因此被广泛使用。而通过env间接查找bash的好处是不硬编码/bin/bash的绝对路径在 bash 安装于非标准位置如/usr/local/bin/bash、或通过 Homebrew、conda 等安装的系统上也能正确解析解释器提高脚本的可移植性。2. 算术展开((...))$(( )) 的兄弟语法Bash 支持两种算术求值写法命令替换形式$(( 表达式 ))求值后把结果作为值替换出来常用于赋值或输出例如仓库 README 中给出的$(( 1 2 ))以及 sum.md 里的echo $(( $1 $2 ))命令形式(( 表达式 ))不输出结果只对表达式求值并产生退出状态码——表达式值非 0 时状态为 1失败值为 0 时状态为 0成功。factors 解法正是利用了命令形式的这一特性。(( $1 % 2 ))中%是取模运算符当$1能被 2 整除时$1 % 2等于 0整条命令返回状态 0成功不能被 2 整除时返回非 0失败。这与 README 中另一道自测题的写法if [ $(($1 % 4)) -eq 0 ]; then在数学上是同一件事——判断n % k 0等价于k 是 n 的因子——只是这里把 if 替换成了短路表达式。3.||与的短路求值把 if 写进一行Bash 中cmd1 || cmd2表示若 cmd1 失败非 0 状态则执行 cmd2cmd1 cmd2表示若 cmd1 成功状态 0则执行 cmd2二者都具备短路特性cmd2 是否执行由 cmd1 的退出状态决定。回到解法第一行(( $1 % 2 )) || resone factor当$1不能被 2 整除时((...))返回失败||右侧的赋值不执行res保持未设置当$1能被 2 整除时((...))返回成功||短路||右侧的赋值也不执行等等——这岂不是反了这里正是本解法最容易让初学者困惑的反直觉点resone factor恰恰是在能被整除时需要设置的。要解开这个矛盾关键在于第三点——注意区分(( 1 ))与(( 0 ))(( 表达式 ))的退出状态规则是表达式值为 0 时返回失败非 0 时返回成功与 C 语言逻辑相反。因此$1取值$1 % 2(( $1 % 2 ))退出状态||结果res最终值40失败1执行右侧赋值one factor71成功0跳过右侧赋值未设置也就是说(( 取模结果 ))的失败状态恰好等于取模结果为 0即能整除。解法巧妙地用取模命令失败来代表因子成立从而让||在正确条件下触发赋值。这种写法在 argument_check.md 的[[ ${1} pizza ]] echo ... || echo ...和 README 中的三元写法[[ $a 1 ]] byes, equal || bnope里是一致的思路——用短路表达式替代 if/else。4.拼接与${res:-$1}参数展开第二行(( $1 % 3 )) || res...actually two!res字符串是 Bash 的追加赋值运算符等价于res$res字符串。当$1同时被 2 和 3 整除如 6、12时res先被赋为one factor再被追加为one factor...actually two!——这正是需求 1、2 叠加的体现注意若res此前未设置即不能被 2 整除会直接把它当作空串处理得到...actually two!输出语义上略显怪异的...actually two!。这是参考解的一个已知行为边界它把有因子 3与因子 2 不存在两种情况都视为可接受输出。后文将给出一个修正版本。第三行echo ${res:-$1}用到 Bash 参数展开${var:-default}当变量var未设置或为空时展开结果为default否则展开结果为var的值注意:-不会真正修改变量本身。这正好覆盖需求 3当res从未被赋值2、3 都不是因子如 5、7时${res:-$1}展开为$1本身脚本打印输入的数字否则打印累积的因子提示文本。三、运行验证把参考解跑起来将参考解保存为factors.sh并赋予执行权限chmod x factors.sh或直接bash factors.sh 数字运行。以 Bash 实测仓库仓库当前环境为 Linux 默认 bash结果如下输入预期输出实测输出解释4one factorone factor4 % 2 0仅命中因子 29...actually two!...actually two!9 % 3 0仅命中因子 3res前缀为空6one factor...actually two!one factor...actually two!同时被 2、3 整除拼接生效12one factor...actually two!one factor...actually two!同上5552、3 均非因子${res:-$1}回退到数字本身777同上实测同时印证了第二节的逐行分析6 与 12 走的是赋值 追加路径5 与 7 走的是参数展开回退路径4 与 9 则分别只命中一个因子。你也可以用bash -x factors.sh 6打开 xtrace 逐步观察每条命令的退出状态与变量变化这与仓库 topics/shell/README.md 中推荐的-x调试手段一致。说明(( 表达式 ))的退出状态规则值为 0 返回失败、非 0 返回成功是 Bash 的既定语义并非本项目自定义行为上述实测输出与逐条推演完全吻合可作为验证依据。四、进阶辨析参考解的边界与改进参考解胜在极简但有两个值得讨论的边界理解它们能帮你写出更稳健的版本。边界 1输入校验缺失脚本直接使用$1未校验参数是否存在、是否为整数。参照仓库其他练习的校验惯例sum.md 用正则re^[0-9]$配合! [[ $1 ~ $re $2 ~ $re ]]校验两个入参必须是数字num_of_args.md 用set -eucase $# in ...)处理 0 个、1 个、多个参数三种情形directories_comparison.md 用test $# -ne 2校验参数个数。参考解的(( $1 % 2 ))在无参数或传入非整数时会报错(( ))把空串/非法内容按 0 处理无参数时直接得到能被 2 整除从而输出one factor行为不符合直觉。因此生产环境建议先加参数个数与数字校验。边界 2单因子输出前缀问题当数字仅被 3 整除如 9时参考解输出...actually two!而非one factor...actually two!因为res在第一步未被赋值、从空串开始。若希望语义更严谨可改为先初始化空值再拼接或显式区分两种情况#!/usr/bin/env bash # 更严谨的版本仅被 3 整除时输出完整的 one factor...actually two! res (( $1 % 2 )) || resone factor if (( $1 % 3 0 )); then res...actually two! fi echo ${res:-$1}其中(( $1 % 3 0 ))是更直观的写法判断取模结果为 0成功状态即代表3 是因子语义与 README 中的if [ $(($1 % 4)) -eq 0 ]完全一致。此版本同样实测通过可作为对比学习材料。五、把它放回训练体系中这份练习的位置与价值在 topics/shell/README.md 的练习索引表中Factors 位列第 4 行Topic 为 Arithmetic、难度为 Basic位于 Hello World、Basic date变量与 Argument Check条件判断之间前后呼应前置铺垫变量赋值HW_STRHello World、echo $(date)、位置参数$1的读取README 自测题echo $1同主题对照算术运算的两种形态$(( 1 2 ))与expr 1 2以及因子判断if [ $(($1 % 4)) -eq 0 ]后续进阶ConditionalsArgument Check 的[[ ]]/||、LoopsCount Chars 的 while、FunctionsSum以及参数处理num_of_args 的case。可以看出Factors 练习是仓库刻意安排的以最少语法点覆盖最多核心机制的一题它在一个脚本内同时训练了算术展开、取模运算、短路求值、追加赋值、参数展开与默认值回退。掌握它之后再看仓库中的echo ${1:-yay}README 变量自测题、echo Today is ${1:-a great day!}great_day.md等默认值展开用法会毫无障碍。六、总结语法点在本练习中的用法仓库中的旁证#!/usr/bin/env bash可移植地指定 Bash 解释器topics/shell/README.md shebang 自测题(( 表达式 ))取模求值用退出状态表达能否整除README 中$(( 1 2 ))、if [ $(($1 % 4)) -eq 0 ]||短路整除时触发赋值argument_check.md、README 三元写法多因子提示文本拼接—Bash 通用语法${var:-default}无因子时回退打印数字README 中echo ${1:-yay}、great_day.md一句话概括factors 参考解用取模命令的失败状态反向表达整除成立再借||与${var:-default}把三分支的 if/else 压缩成三行表达式是理解 Bash 控制流表达式化写法的绝佳入门样例。建议读者对照 topics/shell/factors.md 重新自测再尝试自行实现带输入校验与完整输出的增强版把本节知识点内化为自己的脚本技能。赞分享文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载相关推荐devops-exercises 实战用 Bash 算术与短路逻辑实现因数判断Factors 练习全解析devops exercises 实战用 Bash 算术与短路逻辑实现因数判断Factors 练习全解析 导读 本文围绕 devops exercises文档教程DevOps运维devops-exercises 实战用 Bash 编写主机存活检测脚本host_status / Its Alive!devops exercises 实战用 Bash 编写主机存活检测脚本host_status / Its Alive! 本指南以 devops exe文档教程DevOps运维devops-exercises 仓库实战用 Jenkins Groovy 脚本批量清理 Job 与过期 Builddevops exercises 仓库实战用 Jenkins Groovy 脚本批量清理 Job 与过期 Build 导读 本文以 devops exerci文档教程DevOps运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑