脚本第一行写的是 #!/bin/sh,里面用了 arr=("a" "b") 和 ${arr[0]},执行报 Bad substitution,函数里的初始化全被跳过。日志里能对上时间点,这种反而好排。

Debian 系的 /bin/sh 指向 dash,不支持数组和花括号扩展。shebang 写 sh 就按 dash 解释,bash 专有语法直接报错。这一点先确认清楚,后面就不用反复试。

#!/usr/bin/env bash
files=("a.log" "b.log")
echo "${files[0]}"

围绕「sh 与 bash 语法」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:shebang 改成 #!/usr/bin/env bash;或者把数组换成空格分隔的字符串处理;用 shellcheck -s sh 扫一遍兼容问题;用 sh script.sh 和 ./script.sh 各跑一次。

结果对不对很好判断,sh 和 bash 两种调用方式下都能正常输出第一个元素。

作者 9823189