Bash 脚本由于 Windows 中的路径 C:\Program Files (x86)... 而无法工作

Bash 脚本由于 Windows 中的路径 C:\Program Files (x86)... 而无法工作

我正在 Windows 7 中使用 bash 模拟终端开发 bash 脚本,确切地说我在 MobaXterm 9.1 中使用 bash 终端。原因是我有一台 Windows 7 笔记本电脑,但我的脚本最终将在 Jenkins Linux 服务器上运行。

路径中的空格和/或 ( 阻止我的脚本成功运行。

我的脚本是:

#!/bin/bash
eclexe0="C:\Program Files (x86)\HPCCSystems\6.0.4\clienttools\bin\ecl.exe"
eclexe1="/drives/c/Program Files (x86)/HPCCSystems/6.0.4/clienttools/bin/ecl.exe"
clear

#1
echo "Testing if ecl.exe is available..."
if [ -f "$eclexe0" ]; then
  echo "FOUND." >&2
else
  echo "NOT FOUND." >&2
  exit 1
fi

echo "Executing ecl.exe"

echo 1
eval "$eclexe0"

echo 2

当我运行它时,输出是

截屏

正如你所看到的,脚本对路径不满意C:\程序文件 (x86)。如果我将文件移动到另一个路径(C:\oscar\eclfolder),它就可以工作。我尝试了答案这里但它们不起作用,可能是因为我使用的是 Windows 7...

我怎样才能让这个脚本工作?

答案1

您的脚本不起作用,因为您正在eval可执行文件的路径名上运行。

在任何 shell 脚本中,您都可以使用变量来指定要运行的命令。

如果你不引用你的$variable引用,变量的内容也会根据空格被分割成单独的单词。

您已经引用了变量引用。但是,通过运行eval,您正在解析变量扩展 a 的结果第二时间。你不需要。

下图可能具有启发性:

$ ls
file.txt    file2.txt
$ somevar=ls
$ $somevar
file.txt    file2.txt
$ ls -l
total 0
-rw-r--r--  1 Me  staff  0 Sep  2 16:06 file.txt
-rw-r--r--  1 Me  staff  0 Sep  2 16:06 file2.txt
$ somevar='ls -l'
$ $somevar
total 0
-rw-r--r--  1 Me  staff  0 Sep  2 16:06 file.txt
-rw-r--r--  1 Me  staff  0 Sep  2 16:06 file2.txt
$ "$somevar"
bash: ls -l: command not found
$ 

正如你所看到的,当我尝试运行"ls -l", 引用时,shell 会查找带有该命令的命令精确的名称——包括空格。

在我的例子中,这不是我想要的。

然而,在你的例子中,你想要什么。

不用使用eval "$eclexe0",只需使用"$eclexe0"


更大的图景

免费建议:如果您打算在 Linux 机器上运行脚本,请在 Linux 机器上测试它。 MobaXterm 不是 Linux 盒子。

安装 Vagrant 和 VirtualBox(两者都是免费的)并创建一个可以在其中进行测试的虚拟机。


进一步阅读:

答案2

根据这篇文章,您可能需要像这样转义引号(“\”string“\”):https://stackoverflow.com/questions/5253782/bash-problem-with-eval-variables-and-quotes

相关内容