【问题标题】:How to pass arguments with spaces to MinGW-MSYS shell scripts from the Windows command line?如何从 Windows 命令行将带空格的参数传递给 MinGW-MSYS shell 脚本?
【发布时间】:2013-08-31 00:16:30
【问题描述】:

我有一个 sh 脚本,myscript.sh,它接受一个目录作为输入参数,并对该目录中的文件进行一些递归处理。我想在 Windows 命令行中运行这个脚本(我使用 MinGW/MSYS 发行版)。

如何正确地提供带有空格作为输入参数的路径?

例如,我想给出一个路径,'dirA\dir B'。我尝试了许多不同的组合,包括

sh -c 'myscript.sh "dirA/dir B"'

sh -c 'myscript.sh "dirA/dir\ B"'

sh -c "myscript.sh 'dirA/dir\\ B'"

sh -c "myscript.sh \"dirA/dir B\" "

sh -c "myscript.sh dirA/dir\ B "

但在所有这些上,脚本都将路径理解为“dirA/dir”。

【问题讨论】:

    标签: windows shell cmd escaping sh


    【解决方案1】:

    cmd 不理解单引号。如果 sh 是这样,则将外引号加倍,以便在 cmd 提示符下对参数进行双引号,并将单引号传递给 sh 进行解释。

    您列出的第三个选项是正确的想法,但我不清楚您使用 \\ 做什么。 sh 是否要求您转义双引号字符串中的空格?如果我没记错的话,这是非此即彼的,不是两者兼而有之。其中之一应该可以工作(取决于您的 sh Windows 端口是使用 Unix 风格的正斜杠路径分隔符还是 Windows 风格的反斜杠分隔符或两者兼而有之):

    sh -c "myscript.sh 'dirA/dir B'"
    

    sh -c "myscript.sh 'dirA\dir B'"
    

    我不确定为什么第四个选项不起作用。该方法适用于将双引号参数从 cmd 传递给 PowerShell。例如,这有效:

    powershell -noexit "sl \"C:\Program Files\""
    

    这让我怀疑是 sh 的路径参数 'dirA/dir B'"dirA/dir B" 有问题 - 特别是如果上面的建议不起作用。

    说到 PowerShell,您可能想尝试一下。以下任何一项都应该有效:

    sh -c 'myscript.sh "dirA/dir B"'
    
    sh -c "myscript.sh 'dirA/dir B'"
    
    sh -c 'myscript.sh ''dirA/dir B'''
    
    sh -c "myscript.sh `"dirA/dir B`""
    

    【讨论】:

    • 不幸的是,在您建议的所有变体上,结果都是相同的。唯一的区别是 Powershell 中的sh -c "myscript.sh \"dirA/dir B\""(不在 cmd 中)给出了另一个错误,说 bash 在其输入参数中找不到匹配的双引号。可能问题出在 sh/bash 中。
    • 我不建议在 PowerShell 中尝试。这仅对 cmd 有好处,并且保证不能在 PowerShell 中工作。在 PowerShell 中,反斜杠是转义字符的唯一地方是正则表达式。否则转义字符是反引号,如我的第四个 PowerShell 选项所示。请尝试逐字复制和粘贴所有四个。如果这不起作用,那 表明问题出在 sh 中。您是否尝试过直接在 sh 提示符下传递的命令?
    • 另外,如果您从 Windows 提示符调用 sh 并运行 sh 脚本,bash 是如何参与其中的?你有什么遗漏的吗?
    • myscript.sh 的内容是什么?我怀疑这就是问题所在 - 你正确地传递了参数,从 Windows 提示符到 sh,从 sh 到脚本,但是脚本没有正确处理它。你在脚本中使用它的任何地方都有双引号,即some_sh_command "$1"?如果 $path 有空格,我相信 cd $path 之类的东西在 sh 中不起作用(与 PowerShell 不同,它隐式引用字符串参数)。你需要cd "$path"
    • @xivaxy 那么,您是否尝试在 sh 脚本中双引号引用该字符串?根据您提供的信息,我很确定这就是答案所在。
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2022-01-23
    • 2015-01-21
    • 2022-10-04
    • 1970-01-01
    • 2019-07-14
    • 2015-03-28
    相关资源
    最近更新 更多