You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本创建父子目录问题求助:条件判断无预期结果

解决Bash脚本中条件判断创建目录的问题

我来帮你分析下问题所在,然后给出正确的实现方式:

原代码的核心错误

你的脚本里有两个关键问题:

  1. 大括号扩展未生效:当你把带{A,B,C,D}的路径赋值给变量dir_path时,Bash不会自动展开大括号,所以$dir_path的实际值是字面的/tmp/opt/app/software/{A,B,C,D},而不是四个单独的目录路径。这时候[[ -d $dir_path ]]检查的是这个带大括号的奇怪路径是否存在,显然不存在,所以if条件不成立,不会执行mkdir命令。而你手动执行mkdir时,shell会直接展开大括号,所以能正常创建目录。
  2. 逻辑颠倒:你的if语句是“如果目录存在,就创建它”,这完全反了——我们通常需要的是“如果目录不存在,才创建它”。

最简单的正确实现:直接用mkdir -p

其实你完全不需要写if判断,因为mkdir -p本身就具备“递归创建目录+忽略已存在目录”的功能,这是Unix工具设计的贴心之处:

#!/bin/bash
mkdir -p /tmp/opt/app/software/{A,B,C,D}

执行这个脚本,不管目标目录是否存在,都能达到你想要的效果——不存在的目录会被创建,已存在的不会报错。

如果一定要做条件判断(比如创建前要执行其他操作)

如果你需要在创建目录前检查状态,或者做一些额外操作,可以用数组存储展开后的路径,然后逐个遍历判断:

#!/bin/bash
# 先让大括号扩展生效,把所有目标目录存入数组
target_dirs=(/tmp/opt/app/software/{A,B,C,D})

# 遍历每个目录,检查并创建
for dir in "${target_dirs[@]}"; do
    if [[ ! -d "$dir" ]]; then
        mkdir -p "$dir"
        echo "目录 $dir 已创建" # 这里可以加你需要的额外操作
    else
        echo "目录 $dir 已存在,跳过创建"
    fi
done

这个方法的好处是能精确控制每个目录的创建逻辑,同时确保大括号扩展正确生效。

内容的提问来源于stack exchange,提问作者Anonymuss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:32:49