UNIX:如何以文件作为输入运行程序

时间:2012-05-21 20:25:06

标签: bash unix parameters file-io

我正在编写一个名为“run”的bash脚本,用于测试具有预定义输入的程序。

它将文件作为第一个参数,然后将程序作为第二个参数。

电话看起来像

./run text.txt ./check
例如,程序'run'将以text.txt作为输入运行'check'。这将为我节省大量的测试时间。

现在我有

$2 < text.txt > text.created

因此它需要text.txt并将其重定向为指定程序的输入,这是第二个参数。然后将结果转储到text.created。

我在text.txt中有输入,我知道输出应该是什么样子,但是当我cat text.created时,它是空的。

有人知道以文件作为输入运行程序的正确方法吗?这对我来说似乎很直观,但是'check'程序可能有问题,而不是我在'run'脚本中做的事情?

谢谢!任何帮助总是受到赞赏!

编辑:文件text.txt包含多行文件,每行都有一个程序'check'的输入。

也就是说,text.txt可以包含

asdf1.txt asdf2.txt asdf3.txt

我想测试每个文件asdf1.txt,asdf2.txt,asdf3.txt。

2 个答案:

答案 0 :(得分:2)

使用

进行简单测试
#!/bin/sh

# the whole loop reads $1 line by line
while read
do
    # run $2 with the contents of the file that is in the line just read
    xargs < $REPLY $2
done < $1

工作正常。将该文件命名为“run”并使用

运行它
./run text.txt ./check

我使用./check作为参数执行程序text.txt。不要忘记chmod +x run使其可执行。

这是我使用的样本检查程序:

#!/bin/sh

echo "This is check with parameters $1 and $2"

打印给定参数。

我的档案text.txt是:

textfile1.txt
textfile2.txt
textfile3.txt
textfile4.txt

和文件textfile1.txt,...每个“check”实例都包含一行,例如:

lets go

one two

输出:

$ ./run text.txt ./check
This is check with parameters lets and go
This is check with parameters one and two
This is check with parameters uno and dos
This is check with parameters eins and zwei

答案 1 :(得分:2)

<运算符将文件内容重定向到程序的标准输入。这与将文件的内容用于文件的参数不同 - 这似乎是您想要的。为此

./program $(cat file.txt) 

在bash中(或在普通的/bin/sh中,使用

./program `cat file.txt`

)。

这不会将多行作为单独的调用进行管理,编辑指示需要这些调用。为此,您可能会使用某种脚本语言(perl,awk,python ...),这样可以轻松地解析文件。