23

我一直在阅读大量关于 bash 脚本和程序测试的内容,但我仍然无法使这段代码工作。

基本上它是一个简单的程序,要求用户输入north east southwest。我启动程序,然后它立即要求输入。我只是无法让 bash 脚本给它任何输入。我尝试使用echoand expect

任何帮助表示赞赏。

这是用于获取玩家输入的函数:

int process_input(Map *game)
{
    printf("\n> ");

    char ch = getchar();
    char a = getchar(); //eat enter

    int damage = rand() % 4;

    switch(ch) {

        case -1:
            printf("you suck\n");
            return 0;
            break;
        case 'n':
            game->proto.move(game, NORTH);
            break;
        case 's':
            game->_(move)(game, SOUTH);
            break;
        case 'e':
            game->_(move)(game, EAST);
            break;
        case 'w':
            game->_(move)(game, WEST);
            break;
        case 'a':
            game->_(attack)(game, damage);
            break;
        case 'l':
                    printf("You can go:\n");
                    if(game->location->north) printf("NORTH\n");
                    if(game->location->south) printf("SOUTH\n");
                    if(game->location->east) printf("EAST\n");
                if(game->location->west) printf("WEST\n");
                    break;
        default:
            printf("Whats next?", ch);
        }
        return 1;
}

这是对 bash 脚本的尝试:

   #!/bin/bash
    /Desktop/c
    ./ex17 echo 'w'
4

3 回答 3

34

您可以使用以下任何机制将输入从 bash 输入到程序中。

对于单行输入,您可以使用here-string

./ex17 <<<'w'

对于多行,您可以使用here-document

./ex17 <<'EOF'
w
second line of input
more input
EOF

或者您可以将这些行移出脚本并放入单独的文件中:

./ex17 <filename    

更一般地,您可以运行一个命令,该命令生成程序所需的输入作为其输出,并使用管道将它们连接在一起。例如,上面的也可以写成:

cat filename | ./ex17

或原始示例为

echo w | ./ex17

这更通用,因为您可以在这里用任何类型的程序替换catecho,该程序可以执行各种计算以确定它输出的内容,而不仅仅是转储静态字符串或文件的内容。

但是,您不能从 bash 轻松完成的是驱动输入、读取输出以及决定将什么作为下一个输入发送。为此,您应该查看expect。一个期望脚本看起来像这样:

#!/usr/bin/env expect
spawn ./ex17
expect ">"
send "w\n"
expect "Whats next?"
send "next line here\n"
# turn it back over to interactive user
interact
于 2013-05-12T15:44:58.743 回答
5

试试这个:首先:

 echo w | ./ex17 

这会将 w 发送到示例并输出移动。这称为管道;它本质上将 echo 的标准输出连接到 ex17 的标准输入

于 2013-05-12T15:43:18.050 回答
-1

您可以C编写代码或Bash脚本,而不是混合编写。用于scanf()从键盘读取(当您按 ENTER 时它会停止读取)并用C语言完成此代码。

于 2013-05-12T15:34:25.473 回答