我想用Bash脚本在C中运行我的程序,同样,我希望我的bash脚本将一些值传递给我在C中的程序。这是我的C代码(非常简单,它作为输入数学运算,例如:2 + 3,将其保存到文件,这就是全部):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int howMany = 0, i = 0;
float num1, num2;
char sign;
FILE *fp;
if((fp=fopen("operations.txt", "w"))==NULL)
{
exit(-1);
}
printf("How many math operations would you like to pass?\n> ");
scanf("%d", &howMany);
for(i=0; i<howMany; i++)
{
printf("Pass %d operations like this: {num1 sign num2}:\n> ", i+1);
scanf("%f %c %f", &num1, &sign, &num2);
fprintf(fp, "%f ", num1);
fprintf(fp, "%c ", sign);
fprintf(fp, "%f", num2);
if(i < howMany-1)
fprintf(fp, "\n");
}
fclose(fp);
return 0;
}
然后,我有我的bash脚本,我希望它在C中运行我的程序并给它9个数学运算:1 + 2,3 + 4,... 9 + 10。我是这样做的:
#!/bin/bash
n=9
echo "$n" | ./app
for (( i=1; $i < 10; i++ )) ; do
let "c=$i+1"
echo $i "+" $c | ./app
done
但问题是它不能按我的意愿工作。请帮助 - 只有这个bash脚本,我的C程序才能很好用。
答案 0 :(得分:3)
问题是你正在多次执行你的./app
,每次都只给它一小部分。
您可以对命令进行分组,然后将其全部传送到应用的一个实例,如下所示:
#!/bin/bash
{
n=9
echo "$n"
for (( i=1; $i < 10; i++ )) ; do
let "c=$i+1"
echo $i "+" $c
done
} | ./app
答案 1 :(得分:3)
这是因为您正在运行./app
的独立实例,每个实例都会少于预期的全部数据量。你可以使用类似的东西:
(
n=9
echo "$n"
for (( i=1; $i < 10; i++ )) ; do
let "c=$i+1"
echo $i "+" $c
done
) | ./app
它将()
中的整个命令集作为单个子shell运行,并将该批次的输出通过管道传输到应用程序的单个实例中。
更好的方法可能是使用随机数据,例如:
#!/bin/bash
(
(( count = $RANDOM % 100 + 1 ))
echo ${count}
while [[ ${count} -gt 0 ]] ; do
(( val1 = $RANDOM % 100 ))
(( op = $RANDOM % 2 + 1 ))
(( val2 = $RANDOM % 100 ))
op=$(echo '+-' | cut -c${op}-${op})
echo ${val1} ${op} ${val2}
(( count = count - 1 ))
done
) | ./app
这将为您提供以下内容:
9
9 - 91
56 - 4
85 + 25
23 + 15
6 + 86
10 - 26
99 - 26
19 + 31
33 - 60
可以提供更好的覆盖率。