我有一个shell脚本,它必须从命令行获取参数并将其传递给C中的函数。我试图搜索但没有找到可理解的解决方案。请帮助我。 参数是否应该作为shell脚本中的命令通过选项传递?
我有一个这样的主要功能:
int main(int argc, char *argv[])
{
if(argc>1)
{
if(!strcmp(argv[1], "ABC"))
{
}
else if(!strcmp(argv[1], "XYZ"))
{
}
}
}
如何通过shell脚本从命令行传递参数ABC / XYZ,而shell脚本又使用makefile编译代码?
答案 0 :(得分:2)
你无法将字符串与==
进行有意义的比较,这是一个指针相等测试。您可以将strcmp用作argc>1 && !strcmp(argv[1], "XYZ")
之类的内容。 main
的参数具有某些属性,请参阅here。
BTW,main
的{{1}}至少为1.因此,您的测试argc
永远不会为真。通常argc==0
是程序名称。
但是,如果您使用GNU glibc(例如在Linux上),它会为parsing program arguments提供多种方式。
关于程序参数有conventions and habits,你最好遵循它们。 POSIX指定getopt(3),但在GNU系统上,getopt_long
更方便。
还要注意globbing是由类似Unix的系统上的shell完成的。请参阅glob(7)。
(在Windows上,情况有所不同,命令行可能会被某些启动例程{la crt0解析)
实际上,您最好使用一些系统函数来解析程序参数。一些图书馆提供了一种方法,例如, GTK有gtk_init_with_args
。否则,如果您拥有它,请使用argv[0]
...
另外,还要了解一些free software程序的源代码。你可以在github或其他地方找到很多。
如何通过shell脚本从命令行传递参数ABC / XYZ
如果将C ++程序编译为executable,例如getopt_long
,你只需要运行像
/some/path/to/yourexecutable
如果PATH
variable中包含 /some/path/to/yourexecutable ABC
的目录/some/path/to/
,则只需运行yourexecutable
即可。如何设置yourexecutable ABC
变量(您可以使用Unix shell中的PATH
查询)是一个不同的问题(您可以编辑一些shell startup文件,也许是您的{{ 1}},使用source code editor,例如GNU emacs
,vim
,echo $PATH
等等;您可以运行一些$HOME/.bashrc
....命令使用适当的,以冒号分隔的目录序列。)
又使用makefile编译代码?
然后你应该查看那个gedit
,你就会知道什么是可执行文件。
您正在使用/编写Linux,因此您应该阅读有关Linux编程的内容(例如ALP或更新的内容;另请参阅intro(2)& syscalls(2) ...)并且您需要了解有关操作系统的更多信息(请阅读Operating Systems: Three Easy Pieces)。
答案 1 :(得分:2)
参见以下简单示例:
$ cat foo.c
#include <stdio.h>
int main(int argc, char ** argv)
{
int i;
for (i = 0; i < argc; ++i) {
printf("[%d] %s\n", i, argv[i]);
}
return 0;
}
$ gcc foo.c
$ ./a.out foo bar
[0] ./a.out
[1] foo
[2] bar
$