在 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/Program: No such file or directory
我已经尝试了以上的多种组合。 Bash 将无法识别路径中的 space。我该如何执行?
对bash有更深入了解的人应该能够解释这背后的确切机制,因为我不会,但我知道如何应用a solution:仅在扩展时使用引号变量(否则引号也被明显解释)并使用数组否则你不能不使用引号..还要注意 /
应该是单一的。
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]}"
我偶然发现了 a similar issue dealing with variable expansion。另请注意,简写对我不起作用:
"/p:Configuration=Debug"
变为 "/property:Configuration=Debug"
当您使用包含空格的 paths/commands 时,您需要先引用路径,这对您有用:
test.proj
<?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"
您可以先定义路径,然后在引号中使用它们来执行命令。
您可以复制粘贴此示例,它会为您所用。
我有这个脚本:
build.sh
#!/bin/bash
MSBUILD="/c/Program\ Files \(x86\)/MSBuild/14.0/Bin/msbuild.exe my.sln //p:Configuration=Debug //t:Rebuild"
$MSBUILD
错误
/c/Program: No such file or directory
我已经尝试了以上的多种组合。 Bash 将无法识别路径中的 space。我该如何执行?
对bash有更深入了解的人应该能够解释这背后的确切机制,因为我不会,但我知道如何应用a solution:仅在扩展时使用引号变量(否则引号也被明显解释)并使用数组否则你不能不使用引号..还要注意 /
应该是单一的。
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]}"
我偶然发现了 a similar issue dealing with variable expansion。另请注意,简写对我不起作用:
"/p:Configuration=Debug"
变为 "/property:Configuration=Debug"
当您使用包含空格的 paths/commands 时,您需要先引用路径,这对您有用:
test.proj
<?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"
您可以先定义路径,然后在引号中使用它们来执行命令。
您可以复制粘贴此示例,它会为您所用。