1

我想用 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 程序才能很好地工作。

4

2 回答 2

3

问题是你执行了你的./app几次,每次都喂它整体的一小部分。

您可以对命令进行分组,然后将其全部通过管道传输到您的应用程序的一个实例,如下所示:

#!/bin/bash
{ 
n=9
echo "$n" 

for (( i=1; $i < 10; i++ )) ; do
       let "c=$i+1" 
       echo $i "+" $c
done
} | ./app
于 2013-01-29T08:59:19.463 回答
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

这可能会提供更好的覆盖范围。

于 2013-01-29T09:01:11.967 回答