如何在 bash 脚本中调用 C 程序并将其 return 值存储到变量?
How to call a C program inside bash script and store its return value to a variable?
我有 bash 脚本,我在其中询问用户一些输入,然后我想调用 C 程序几次,然后对 return 值求和。请注意,我的 C 程序中的主函数也有一些 printf
语句,它 return 是一个整数值。这是我的 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程序中的主函数中获取return语句的值并在bash中使用它?
如果你有输出文件,
gcc abc.c -o abc
那么你可以这样做,
output=`./abc <agr1> <agr2> <arg3>`
echo $output
您不需要存储它的 return 值,它存储在特殊变量 ?
中,所以只需
./cprogram
echo $?
这将输出 cprogram
的退出代码,您当然可以现在将其分配给一个变量,如果您需要调用另一个程序并保留该值。
程序的 return 值存储在 $?
变量中。所以你只需要添加每个 $?
:
for i in $frames;
do
./enc_ber $bytes $snr $modulation $channel $alamouti
encBER=$((encBER + $?))
done
请注意,该值限制为八位,因此最大值为 255。
如果您想捕获一个大于 255 的整数或一个浮点数,请使用 stderr 处理所有您不想要的内容 (fprintf(stderr, "Things I don't want\n");
) 并使用 stdout 打印 return 值你想抓。
程序的输出与其return代码不同。 return码一般应该为0,表示成功,或者非零,表示失败。如果你想要 return 代码,那么你可以简单地 运行 程序然后检查变量 $?
:
./enc_ber $bytes $snr $modulation $channel $alamouti
retVal=$?
# retVal now contains the value passed back from the exit of your program.
注意不要在 运行 执行程序和检查结果之间做任何事情,否则 $?
的值将再次改变。
另一方面,如果您希望您的程序向标准输出写入一个值并且这是您需要获得的输出,那么您必须将输出重定向到一个文件,然后读取文件的内容:
./enc_ber $bytes $snr $modulation $channel $alamouti >./my_file.txt
output=$( cat my_file.txt )
# output now contains whatever enc_ber wrote to stdio
当然,您的程序必须仅编写您希望捕获的那些内容。日志行和其他额外的格式会给您带来问题。上面是一个简单的例子 - 由你来解析你的程序输出的任何内容,但是上面的例子应该适用于简单的数字输出。
我有 bash 脚本,我在其中询问用户一些输入,然后我想调用 C 程序几次,然后对 return 值求和。请注意,我的 C 程序中的主函数也有一些 printf
语句,它 return 是一个整数值。这是我的 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程序中的主函数中获取return语句的值并在bash中使用它?
如果你有输出文件,
gcc abc.c -o abc
那么你可以这样做,
output=`./abc <agr1> <agr2> <arg3>`
echo $output
您不需要存储它的 return 值,它存储在特殊变量 ?
中,所以只需
./cprogram
echo $?
这将输出 cprogram
的退出代码,您当然可以现在将其分配给一个变量,如果您需要调用另一个程序并保留该值。
程序的 return 值存储在 $?
变量中。所以你只需要添加每个 $?
:
for i in $frames;
do
./enc_ber $bytes $snr $modulation $channel $alamouti
encBER=$((encBER + $?))
done
请注意,该值限制为八位,因此最大值为 255。
如果您想捕获一个大于 255 的整数或一个浮点数,请使用 stderr 处理所有您不想要的内容 (fprintf(stderr, "Things I don't want\n");
) 并使用 stdout 打印 return 值你想抓。
程序的输出与其return代码不同。 return码一般应该为0,表示成功,或者非零,表示失败。如果你想要 return 代码,那么你可以简单地 运行 程序然后检查变量 $?
:
./enc_ber $bytes $snr $modulation $channel $alamouti
retVal=$?
# retVal now contains the value passed back from the exit of your program.
注意不要在 运行 执行程序和检查结果之间做任何事情,否则 $?
的值将再次改变。
另一方面,如果您希望您的程序向标准输出写入一个值并且这是您需要获得的输出,那么您必须将输出重定向到一个文件,然后读取文件的内容:
./enc_ber $bytes $snr $modulation $channel $alamouti >./my_file.txt
output=$( cat my_file.txt )
# output now contains whatever enc_ber wrote to stdio
当然,您的程序必须仅编写您希望捕获的那些内容。日志行和其他额外的格式会给您带来问题。上面是一个简单的例子 - 由你来解析你的程序输出的任何内容,但是上面的例子应该适用于简单的数字输出。