Bash中传递含大括号扩展的变量给mkdir命令的问题
问题原因与解决方法
核心原因
Bash的大括号扩展(比如{1..5})是在变量展开之前执行的。当你把带{1..5}的字符串赋值给变量subdir时,大括号不会被解析为扩展语法,而是被当作普通字符存储。执行mkdir -p $subdir时,bash只会把变量内容原样展开,最终创建的是包含{1..5}字符的目录,而非你想要的嵌套组合目录。
可行解决方案
方法1:用eval强制重新解析扩展
eval会让bash重新处理变量内容,触发大括号扩展:
subdir="subdir{1..5}/subdir{1..5}/subdir{1..5}/subdir{1..5}" eval mkdir -p "$subdir"
注意:
eval会执行变量里的所有命令,若变量内容来自不可信来源存在安全风险,但这里是自定义路径,可放心使用。
方法2:用数组存储预扩展的路径
提前让bash完成大括号扩展,把结果存入数组,再传递给mkdir:
# 直接赋值时完成大括号扩展,存入数组 subdir=(subdir{1..5}/subdir{1..5}/subdir{1..5}/subdir{1..5}) # 展开数组所有元素作为mkdir的参数 mkdir -p "${subdir[@]}"
这种方法更安全,避免了eval的潜在风险,是推荐做法。
方法3:用函数封装逻辑(适合复用场景)
如果需要多次创建类似结构的目录,可以写一个简单函数:
make_nested_dirs() { mkdir -p "$1" } # 调用时直接传入带大括号扩展的路径,此时会先完成扩展再传入函数 make_nested_dirs subdir{1..5}/subdir{1..5}/subdir{1..5}/subdir{1..5}
内容的提问来源于stack exchange,提问作者Nishi K
相关产品推荐
相关产品推荐

