使用mkdir创建嵌套目录时波浪号路径未解析为家目录的解决办法
解决波浪号路径未正确展开的问题
你的问题核心是shell的展开顺序导致变量中的~无法被解析为家目录:shell会先处理波浪号展开,再处理变量替换,所以当reportdir变量里存的是~/Q4Y22/report/时,变量替换后~会被当成普通字符,最终创建字面意义的~/Q4Y22/report目录。
以下是几种更巧妙的解决方法:
方法1:用bash参数替换直接替换~为$HOME
这是最高效的方式,无需调用外部命令,直接利用bash的字符串替换特性:
# 假设你已经通过sed+dirname得到了reportdir reportdir=${reportdir/#\~/$HOME} # 之后再执行目录判断和创建 if [ -d "$reportdir" ] then echo "dir exists, keep moving" else mkdir -p "$reportdir" fi
解释:${var/#pattern/replacement}是bash的前缀替换语法,只会替换字符串开头的~为$HOME的值,完美匹配你的场景。
方法2:用eval强制展开波浪号
eval会让shell重新解析字符串,从而触发波浪号展开:
reportdir=$(eval echo "$reportdir") # 后续目录操作同上
注意:如果路径中包含特殊字符(比如空格、通配符),eval可能带来风险,但如果是你自己控制的路径,这个方法简单直接。
方法3:提取路径时直接处理
在使用sed提取路径的阶段,就把~替换为$HOME,比如:
# 假设原来的sed提取命令是类似这样的 raw_path=$(echo "$REPORT" | sed 's/.*(\(.*\))/\1/') reportdir=$(dirname "$raw_path" | sed "s/^~/$HOME/")
这样得到的reportdir直接就是展开后的绝对路径,无需后续处理。
内容的提问来源于stack exchange,提问作者Fnechz
相关产品推荐
相关产品推荐

