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 用