Shell 脚本应避免硬编码:用 $BASH_SOURCE[0]获取脚本路径,参数用 ${1:-default}设默认值,敏感配置外置并设 600 权限;处理空格文件名需 find -print0 配合 read -d ”;通过 [[“${BASH_SOURCE[0]}” == “${0}” ]] 区分直接执行与 source 调用;cron 中须显式声明 PATH、用绝对路径、指定 bash 解释器。

Shell 脚本里怎么避免硬 编码 路径和参数
硬编码是自动化脚本最常崩的点——换台机器、换个用户、甚至换个项目目录,./deploy.sh 就报 No such file or directory。根本不是语法错,是路径失效。
解决思路就一条:把可变部分抽成变量,且优先从环境或调用时传入,而不是写死。
-
SCRIPT_DIR=$(cd "$(dirname"${BASH_SOURCE[0]}")" && pwd)—— 获取脚本自身所在绝对路径,比pwd可靠得多 - 用
${1:-"/opt/app"}表示“第一个参数,没传就用默认值”,避免空值导致命令失败 - 敏感配置(如密码、token)绝不写进脚本,改用
source ./env.conf或读取$HOME/.mytoolrc,且确保该文件权限为600
批量处理文件时 为什么 find + while 读不出带空格的文件名
这是 Shell 新手掉进最多次的坑:find . -name "*.log" | while read f; do echo $f; done 遇到 error log 2024.txt 就只输出 error。
本质是 read 默认按空白符分割,而 find 的输出没有做安全分隔。正确做法是让 find 控制分隔方式,再配对处理:
find . -name "*.log" -print0 | while IFS= read -r -d ''file; do echo"Processing: $file" # 这里可以安全使用 $file,含空格、换行都 OK done
关键点:-print0 让 find 用