Как запустить программу c в сценарии bash и дать ей некоторые значения?

Я хочу запустить свою программу на C с помощью сценария bash, также, чтобы мой скрипт bash передавал некоторые значения моей программе в C. Это мой C-код (очень простой, он читается как вводные математические операции, например: 2 + 3, сохраняет его в файл, и все это):

#include 
#include 

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 ", 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

но проблема theres оно не работает по мере того как я хочу его к. Пожалуйста, помогите - только с этим сценарием bash моя программа на C работает просто отлично.

1
nl ja de
«theres проблема, котор он не работает по мере того как я хочу его к» - вы должны объяснить что проблема настолько, что мы можем помочь вам! Вы пробовали печатать некоторые отладочные данные в своей программе на C? Каков результат?
добавлено автор jazzbassrob, источник
echo "$ n" | ./app после этого ваш код будет закрыт, и в цикле вы будете запускать его на каждой итерации. Если вы хотите просто заменить stdin на канал, сначала заполните некоторые данные (например, A = "9; ... A =" $ A \ n $ i + $ c \ n ", затем выполните что-то вроде echo -e $ A |./app`.
добавлено автор Eddy_Em, источник

2 ответы

Это связано с тем, что вы запускаете независимые экземпляры ./ app , давая каждому меньше, чем полный объем данных, который он ожидает. Вы можете обойти его с чем-то вроде:

(
    n=9
    echo "$n"

    for (( i=1; $i < 10; i++ )) ; do
        let "c=$i+1" 
        echo $i "+" $c
     done
) | ./app

Это выполняет весь набор команд в () как одну под-оболочку и передает вывод лота в экземпляр single вашего приложения.


Еще лучший подход может заключаться в использовании случайных данных, таких как:

#!/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

которые могут обеспечить лучшее покрытие.

3
добавлено
Убейте вас примерно на 45 секунд там ^^
добавлено автор that other guy, источник

Проблема заключается в том, что вы выполняете свой ./ app несколько раз, каждый раз кормите его небольшой частью целого.

Вы можете сгруппировать команды, а затем передать все это в один экземпляр вашего приложения следующим образом:

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

for (( i=1; $i < 10; i++ )) ; do
       let "c=$i+1" 
       echo $i "+" $c
done
} | ./app
3
добавлено
идеально! большое спасибо за помощь :)
добавлено автор Katie, источник
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.