如何通过shell脚本

时间:2018-01-02 06:20:31

标签: c linux function shell command-line

我有一个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编译代码?

2 个答案:

答案 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解析)

实际上,您最好使用一些系统函数来解析程序参数。一些图书馆提供了一种方法,例如, GTKgtk_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 emacsvimecho $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
$