在Windows MinGW环境下的Bash中转换路径格式的方法
在Windows Bash中将类Unix路径转换为Windows本地格式
问题场景
现有如下Bash脚本:
PATH_SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" echo "$PATH_SCRIPT"
执行后输出类Unix格式路径:
/c/path/to/where/the/file/is
需要在Windows环境的Bash中,将该路径转换为Windows本地格式:
C:\path\to\where\the\file\is
且转换后的路径需能作为变量传递使用。
解决方案
方法一:使用cygpath工具(推荐)
Cygwin、Git Bash等常见Windows Bash环境自带cygpath工具,专门用于类Unix路径与Windows路径的转换,用法简单:
PATH_SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # 转换为Windows格式路径,-w参数指定输出Windows风格路径 WIN_PATH_SCRIPT=$(cygpath -w "$PATH_SCRIPT") # 输出转换后的路径,变量WIN_PATH_SCRIPT可直接传递给其他命令 echo "$WIN_PATH_SCRIPT"
方法二:纯Bash字符串替换(无需额外工具)
若环境中没有cygpath,可通过Bash内置的字符串替换功能手动转换:
针对固定盘符(如C盘)的简化写法
PATH_SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # 替换开头的/c/为C:\,再全局替换所有/为\ WIN_PATH_SCRIPT="${PATH_SCRIPT/#\/c\//C:\\}" WIN_PATH_SCRIPT="${WIN_PATH_SCRIPT//\//\\}" echo "$WIN_PATH_SCRIPT"
通用盘符处理(适配任意盘符)
PATH_SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # 提取路径首字母作为盘符,转换为大写 DRIVE=$(echo "${PATH_SCRIPT:1:1}" | tr '[:lower:]' '[:upper:]') # 替换开头的/x/为X:\(x为对应盘符) WIN_PATH_SCRIPT="${PATH_SCRIPT/#\/${DRIVE,,}\//${DRIVE}:\\}" # 全局替换所有/为\ WIN_PATH_SCRIPT="${WIN_PATH_SCRIPT//\//\\}" echo "$WIN_PATH_SCRIPT"
注:${DRIVE,,}是Bash 4.0+的语法,用于将盘符转为小写,确保匹配路径开头的/x/格式。
内容的提问来源于stack exchange,提问作者Mefitico
相关产品推荐
相关产品推荐

