Bashrc脚本不会更改包含空格的操作字符串上的目录

时间:2019-04-29 19:57:42

标签: bash shell

我正在尝试开发一种快速的解决方案,以在Windows和Cygwin之间的文件夹上导航。

在Windows上,路径如下:

C:\Users\foo\my folder\

当我需要进入Cygwin上的同一文件夹时,我需要使用以下格式

/cygdrive/c/Users/foo/my\ folder/

每次使用资源管理器时,我都需要复制链接并进行编辑。

所以我为我的.bashrc文件制作了一个简单的脚本

它对于包含空格的路径非常有效,但是当我尝试用'\ '替换空格时,链接找不到目录。

我试图回显路径,将其复制并粘贴到终端上,并且可以正常工作。

但这不起作用:

function cdWinPath(){
    if [ `expr index "$1" C:\\` == '1' ] 
    then
        length=`expr length "$1"`
        pathSubs=${1:2:$length}
        cygPath="/cygdrive/c${pathSubs//\\/\/}"

        cygPath="${cygPath// /\\\ }" #piece of code that replaces blank space
        echo "cd $cygPath"

        cd "$cygPath" # shows 'No such file or directory'
    else
        echo "Could not understand path $1"
    fi
}

1 个答案:

答案 0 :(得分:0)

shell会在扩展变量之前解析引号和转义符,因此不会像对待普通字符一样对待变量值中的引号和转义符。因此,不要尝试在变量中嵌入转义符,只需在变量引用周围加上双引号即可。

其他一些建议:不用弄乱expr,而只需使用shell的内置字符串操作即可。当确实需要捕获其他程序的输出时,请使用$( )而不是反引号。最后,function关键字是非标准的,只需在名称后使用()即可定义函数。像这样:

cdWinPath() {
    local cygPath="${1/#[Cc]:\\//}"    # Replace 'C:\' or 'C:\' prefix with just '/'
    cygPath="${cygPath//\\//}"         # Replace any other '\' with '/'
    cd "$cygPath"
}

但是,请注意,这要求将Windows路径正确传递给该函数。这意味着路径中 中的反斜杠和/或空格必须正确转义或加引号(这意味着必须对所有变量引用都加双引号)。

cdWinPath 'C:\Users\foo\my folder\'     # This works
cdWinPath C:\\Users\\foo\\my\ folder\\  # So does this
cdWinPath C:\Users\foo\my folder\       # This does not work

cdWinPath "$somevar"                    # This works, provided `somevar` is properly set
cdWinPath $somevar                      # This does not work

如果您希望它容忍错误地传递的路径,则可以通过将第一行替换为以下内容来使其更具容忍性:

local cygPath="${*/#[Cc]:\\//}"

使用${*...}而不是$[1...}会将所有参数传递给函数,并将它们与它们之间的空格混合在一起,并假设它们最初是在空格上分割的一个字符串。这有时会起作用,但并非总是如此。例如,以下命令:

cdWinPath C:\Users\foo\my folder\

...仍然不起作用,因为外壳程序会在函数甚至获取字符串之前将反斜杠解释为转义符,并且没有办法解决。