繁体   English   中英

在Shell脚本中执行带空格的命令

[英]Execute commands with spaces in shell script

我有这个脚本:

build.sh

#!/bin/bash
MSBUILD="/c/Program\ Files \(x86\)/MSBuild/14.0/Bin/msbuild.exe my.sln //p:Configuration=Debug //t:Rebuild"
$MSBUILD

错误

/ c /程序:没有这样的文件或目录

我已经尝试了上述多种组合。 Bash无法识别路径中的该空间。 我该如何执行呢?

某些对bash有深入了解的人应该能够解释其背后的确切机制,因为我不能,但是我确实知道如何应用解决方案 :仅在扩展变量时使用引号(否则引号也将得到明显解释)并使用一个数组,否则您将不能使用引号。.另外请注意, /应该是单引号。

MSBUILD[0]=/c/Program\ Files \(x86\)/MSBuild/14.0/Bin/msbuild.exe
MSBUILD[1]=my.sln
MSBUILD[2]=/p:Configuration=Debug

"$MSBUILD[@]"

这是我最终使用的:

MSBUILD[0]="/c/Program Files (x86)/MSBuild/14.0/Bin/msbuild.exe"
MSBUILD[1]=./mySolutionName.sln
MSBUILD[2]=/property:Configuration=Debug
MSBUILD[3]=/target:Clean,Build

"${MSBUILD[0]}" "${MSBUILD[1]}" "${MSBUILD[2]}" "${MSBUILD[3]}"

我偶然发现了一个变量扩展有关的类似问题 另请注意,速记不适用于我:

"/p:Configuration=Debug"变为"/property:Configuration=Debug"

当您使用包含空格的路径/命令时,需要首先引用路径,这将为您工作:

测试项目

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="Build">
    <Message Text="Hello World! $(ABC)" Importance="high"/>
  </Target>

</Project>

build.sh

#!/bin/bash
MSBUILDPATH=c:/Program\ Files\ \(x86\)/MSBuild/14.0/Bin/msbuild.exe
"$MSBUILDPATH" test.proj //t:build //p:ABC=123

或(插入反斜杠)

#!/bin/bash
MSBUILD=c\:\\Program\ Files\ \(x86\)\\MSBuild\\14.0\\Bin\\msbuild.exe
"$MSBUILD" test.proj //t:build //p:ABC=123

我通过目标(/ t :)和属性(/ p :)都没有问题,只需对它们使用双斜杠即可。 还要注意驱动器号后的冒号(:)。

如果您需要传递包含空格的属性,请执行以下操作:

"$MSBUILD" test.proj //t:build //p:ABC="123 456 789"

您可以先定义路径,然后在引号中使用它们来执行命令。

您可以复制粘贴此示例,它将为您工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM