我正在 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