2012-06-30 22 views
3

我想在Linux中编写一个bash脚本,它多次执行一个程序(例如3次),并根据文本文件中提供的值列表指定开关值。在bash脚本中,如何将文本文件中包含的值提供给程序执行的开关?

例如,假设有一些程序programname有一个开关-switch,它将浮点数作为输入。因此,该程序的执行可能是:

programname -switch 0.05 

其中0.05是传递给交换机-switch的特定值。

现在我想阅读某种文本文件,其中有一个值列表,我想在programname的不同调用中连续传递给-switch。我的文本文件test.txt可能包含这些数据:

0.05 
3.19 
100.75 

我想编写一个bash脚本,将在文本文件中读取,并有效地做出接连这些调用:

programname -switch 0.05 
programname -switch 3.19 
programname -switch 100.75 

我想到的像这样:

#!/bin/bash 
for i in {1..3} 
do 
programname -switch $x 
done 

但是,我应该输入什么来代替$x?换句话说,我不知道如何在test.txt中读取,并随着for循环运行一个接一个地将其内容提供给-switch。你有什么建议吗?谢谢!

回答

1

values.txt:

0.05 
3.19 
100.75 

script.sh:

#!/bin/bash 

counter=1 
for value in $(cat values.txt) 
do 
    programname -switch $value -counter $counter 
    counter=$(expr $counter + 1) 
done 
+0

谢谢!我没有在我的原始文章中指定这个,但不幸的是我仍然需要整数计数器'i',因为我会在另一个开关中将'i'(即'$ i')的值传递给'programname'我没有在我的问题中指定)。有什么方法可以维护'我'吗? – Andrew

+0

@Andrew我已经更新了我的答案。 – trojanfoe

+0

@Andrew没问题。 – trojanfoe

4

无需使用任何外部工具。计数器增量和read可以如图所示一起完成,或者计数器增量可以在循环内的任何位置移动。

while ((i++)); read -r value 
do 
    programname -switch "$value" -other "$i" 
done < test.txt 
+0

谢谢,但这似乎不适用于我的应用程序,因为'$ value'和'$ i'在引号中:''$ value“'和'”$ i“'。不幸的是,对于我的应用程序,我需要将'$ value'作为浮点(常规输入)传入,而不是作为引号中的字符串。 – Andrew

+3

@Andrew:你的应用程序永远不会看到引号。 shell(Bash)使用它们来保护变量的内容,然后在将内容传递给应用程序之前将其删除。 –

+0

如果您需要将参数作为浮点值传递而不是字符串,那么您运气不好。 shell使用字符串。即使execvp只接受char *参数,所以你将不得不非常努力地传递除字符串之外的其他东西。 –

相关问题