我有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中使用它?
答案 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