命令在命令行中有效,但在bash脚本中没有给出“没有这样的文件或目录”

use*_*301 2 bash cygwin

就像标签说的那样,这是在Cygwin中。

我有一个可以从Cygwin控制台运行的命令行程序:

./optAlg.exe data/5Node/1.dat 500 2>&1 > output/1.out
Run Code Online (Sandbox Code Playgroud)

我编写了以下bash脚本以使其循环

#!/bin/bash

for inputFile in data/5Node/*.dat
do
  outputFile=${inputFile##*/} #strip output name from input name
  outputFile=${outputFile%.*} #strip output name input file
  outputFile+=".out"
  "./optAlg.exe $inputFile 500 2>&1 > output/$outputFile"
done
Run Code Online (Sandbox Code Playgroud)

当我运行bash脚本时,对于for循环的每次迭代,我都会得到“没有这样的文件或目录”,例如,

./batchOpt.sh: line 8: ./optAlg.exe data/5Node/1.dat 500 2>&1 > output/1.out: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?我不确定自己在做什么错。

Ale*_*-A. 5

删除第8行周围的引号。
像这样:

./optAlg.exe "$inputFile" 500 2>&1 > "output/$outputFile"
Run Code Online (Sandbox Code Playgroud)

通过在整行上加上引号,您可以告诉bash执行一个被准确调用的命令,./optAlg.exe $inputFile 500 2>&1 > output/$outputFile当然没有这样的命令。实际上,您想./optAlg.exe使用参数来运行。不要忘记在变量周围加上引号,因为否则会将带有空格字符的文件名作为几个参数传递。
阅读有关参数的信息
您还可以阅读有关常见陷阱的信息