Bash 负数截取偏移:冒号后少一个空格,为什么拿到整段字符串 脚本想从编号末尾取三个字符,却拿回完整编号。表达式里的冒号和减号紧挨着,Bash 把它读成默认值展开,而没有进入字符串截取。给负数偏移留出空格,看起来只是排版变化,实际上是在选择另一种语法;因此这类问题不能只检查变量... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash select 菜单:输入选项文字,为什么没有选中那一项 用 Bash 做一个简单菜单,用户输入选项文字以后,变量却变成空串;再按一次空回车,循环体甚至没有执行。select 不等于“把输入文本赋给变量”的普通读取,它会先把选项编号,然后按输入编号选择对应的词。菜单变量保存... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash 花括号展开:上限换成变量,为什么范围就不再展开 脚本里原来写着 part{1..3},能生成三个名称。把上限提取成变量之后,却只剩下一个带花括号的字符串。变量明明有值,末尾打印出来也像合法范围,为什么 Bash 没有再展开一次?关键在于展开阶段的先后顺序。花括号展... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
Bash wait -n -p:先结束的是哪个任务,退出码又属于谁 把三个检查任务放到后台后,父脚本需要知道谁先结束、哪个失败。只在最后执行不带参数的 wait,虽然能等待后台任务,却不能把每个任务的退出码逐一交出来。要建立可靠结果表,需要同时保留进程身份和等待状态。wait -n ... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
Bash 目录栈:popd 删除一个条目,为什么有时并不切换目录 连续进入几个目录后,popd 好像是“返回上一个目录”。但给它加上索引,当前位置可能完全不动;使用 dirs -c 清空目录栈后,当前路径也依旧存在。问题在于目录栈不是浏览器历史,它的首项始终与当前目录有关,其他条目... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
Bash 重定向顺序:2>&1 写在前面,为什么错误输出没有进入日志 两个符号都写了,日志仍然少一半希望把正常输出和错误输出一起保存时,常见写法是命令后接 >log 2>&1。如果把顺序改成 2>&1 >log,看上去依旧同时提到了日志和两个输出通道,实际结果却不同。关键在于 Bash... yunqueblog/ 技术教程/ 2026-10-01/ 3 阅读
Bash printf 格式串:文本里的百分号为什么不能直接交给第一个参数 脚本读取了一段带百分号的文本,原样保存没有问题,交给 printf 却少了字符,甚至报格式错误。给变量加双引号仍然无效,是因为问题不在分词,而在参数的角色:printf 的格式参数会被解释,其中的百分号与反斜杠拥有特... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
Bash case 的三个结尾:停止匹配、直接贯穿与继续检查怎样区分 一个文件分类脚本想给 report.log 同时标记“日志”和“报告”,把 case 分支结尾改了一下,却又标上了“表格”。问题往往不在文件名,而在分支执行完之后选择了哪一种控制方式。Bash 的三个结尾长得接近,后... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
Bash set -e 的条件边界:函数放进 if 后,内部失败为什么继续执行 脚本开头已经写了 set -e,一个包含多步操作的函数单独调用时会在失败后退出。后来为了输出更友好的错误信息,调用者把它放进 if 条件,失败步骤之后的命令却继续运行,甚至走进成功分支。这不是失败命令突然成功,而是调... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读
Bash command 与 type:绕过同名函数以后,为什么仍可能执行内建命令 同一个名字不一定指向同一个东西你在终端输入一个常用命令,输出却多了提示文字;复制进脚本后又恢复正常。先别急着重装程序,这个名字可能被别名或 shell 函数包装过。Bash 会按自己的解析和查找规则决定运行目标,命令... yunqueblog/ 技术教程/ 2026-10-01/ 2 阅读