如何在bash脚本中调用C程序并将其返回值存储到变量中?

时间:2015-01-14 10:42:54

标签: c linux bash

我有bash脚本,我要求用户提供一些输入,然后我想调用一个C程序几次,并将返回值相加。请注意,我的C程序中的main函数也有一些printf语句,它返回一个整数值。这是我的bash脚本的一部分:

 #!/bin/bash

encBER=0

// Some other code where I read the values from the user

for i in $frames;
do
    tempEncBER=$(./enc_ber $bytes $snr $modulation $channel $alamouti)
    encBER=$((encBER + tempEncBER))
done

echo "Total BER is:" $encBER

关键是我要求它执行10次,这意味着frames变量的值为10,但它执行一次,它显示一些语法错误,然后再次执行,并为最终结果,encBER的值为0.它根本不存储任何东西。如何在我的C程序中的main函数中获取return语句的值并在bash中使用它?

4 个答案:

答案 0 :(得分:5)

程序的返回值存储在$?变量中。因此,您只需添加每个$?

for i in $frames;
do
    ./enc_ber $bytes $snr $modulation $channel $alamouti
    encBER=$((encBER + $?))
done

请注意,该值限制为8位,因此最大值为255。


如果要捕获大于255的整数或浮点数,请使用stderr执行您不想要的所有内容(fprintf(stderr, "Things I don't want\n");)和stdout以打印要捕获的返回值

答案 1 :(得分:4)

程序中的输出与其返回代码不同。返回码通常应为0,表示成功,或非零,表示失败。如果你想要返回代码,那么你可以简单地运行程序并在之后检查变量$?

./enc_ber $bytes $snr $modulation $channel $alamouti
retVal=$?
# retVal now contains the value passed back from the exit of your program.

小心不要在运行程序和检查结果之间做任何事情,否则$?的值会再次改变。

另一方面,如果您希望程序将值写入stdout并且这是您需要获取的输出,那么您必须将输出重定向到文件,然后读取文件的内容:

./enc_ber $bytes $snr $modulation $channel $alamouti >./my_file.txt
output=$( cat my_file.txt )
# output now contains whatever enc_ber wrote to stdio

当然,你的程序必须写 那些你想要捕获的东西。日志行和其他额外的格式将导致您的问题。以上是一个简单的例子 - 由您来解析程序输出的任何内容,但上述内容应该适用于简单的数字输出。

答案 2 :(得分:1)

您不需要存储它的返回值,它存储在特殊变量?中,所以只需

 
./cprogram
echo $?

将输出cprogram的退出代码,如果您需要调用另一个程序并保留此值,您当然可以将其分配给变量。

答案 3 :(得分:0)

如果您有文件,

gcc abc.c -o abc

然后你可以这样做,

output=`./abc <agr1> <agr2> <arg3>`

echo $output