修复Bash脚本中for循环+if语句批量检查多服务器目录的异常
问题分析与解决
原脚本的核心问题是:目录存在性检查是在本地执行的,并非目标远程服务器。所以会把本地的目录状态错误当成所有远程服务器的状态,导致后续服务器的判断完全失真。
修正后的脚本
#!/bin/bash host=(server1 server2) HOME_PATH="/opt/test" for my_hosts in "${host[@]}" do echo "处理服务器: $my_hosts" # 在远程服务器执行目录检查与创建逻辑 ssh -o "StrictHostKeyChecking no" root@${my_hosts} << EOF if [ ! -d "$HOME_PATH" ]; then mkdir -p "$HOME_PATH" echo "$HOME_PATH 已创建" else echo "$HOME_PATH 目录已存在" fi EOF done
关键修改点
- 把判断逻辑移到远程执行:通过Here Document(
<< EOF)将整个检查、创建逻辑传给远程服务器,确保所有操作都是在目标机器上完成的,获取的是远程真实的目录状态。 - 修正循环引号:原脚本里
for my_hosts in \"${host[@]}\"的转义引号完全多余,直接用"${host[@]}"就能正确遍历数组元素,避免空格或特殊字符导致的拆分问题。 - 统一变量引号:给
HOME_PATH赋值时加上双引号,远程命令里的变量也用双引号包裹,防止路径包含特殊字符时出错。 - 增加服务器标识输出:让输出更清晰,明确当前处理的是哪台服务器。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

