如何获取脚本bash中传递的位置参数?

时间:2018-10-04 10:38:14

标签: c bash

我开始用C语言编程,我问自己这个问题。

我有一个文件lol.c:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {
    printf ("argc\t= %d\n", argc);

    for (int i=0; i < argc; i++)
        printf ("argv[%i]\t= %s\n", i, argv[i]);

    return 0;
}

因此,当我执行文件时(编译后):

./lol "abc" "def"

他回来了:

argc    = 3
argv[0] = ./lol
argv[1] = abc
argv[2] = def

现在,我有一个bash脚本lol.sh:

#!/bin/bash

./lol "abc"

当我执行文件时:

bash lol.sh def

所以我们得到了:

argc    = 2
argv[0] = ./lol
argv[1] = abc

如何获取传递到bash脚本的位置参数(从文件lol.c)?

我的第一个解决方案是将位置参数传递给lol命令,例如(lol.sh):

#!/bin/bash

./lol "abc" "$*"

他回来了:

argc    = 3
argv[0] = ./lol
argv[1] = abc
argv[2] = def

我对这种解决方案不是很满意,还有另一种方法吗?

谢谢

2 个答案:

答案 0 :(得分:0)

"$*"工作时,它将所有参数合并为一个,并用空格分隔原始参数。您可以通过运行以下内容查看此信息:

bash lol.sh def ghi jkl

会产生:

argc    = 3
argv[0] = ./lol
argv[1] = abc
argv[2] = def ghi jkl

运行bash lol.sh会产生:

argc    = 3
argv[0] = ./lol
argv[1] = abc
argv[2] = 

很少使用"$*"来表示正确;您通常应使用"$@"逐字传递参数作为单独的参数,并正确处理“无参数”(而"$*"创建一个空字符串作为参数)。

此命令应执行您想要的操作:

./lol "abc" "$@"

那么bash lol.sh def ghi jkl的输出将是:

argc    = 5
argv[0] = ./lol
argv[1] = abc
argv[2] = def
argv[3] = ghi
argv[4] = jkl

,来自bash lol.sh的输出为:

argc    = 2
argv[0] = ./lol
argv[1] = abc

另请参阅How to iterate over arguments in a bash script?

答案 1 :(得分:0)

我尝试@mnistic的建议,即获取父进程并获取其命令行。

所以我尝试了这个:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define SIZE 1024

int main (int argc, char *argv[]) {
    int ppid = getppid();
    char cmd[SIZE];

    FILE* file = NULL;

    sprintf(cmd, "/proc/%d/cmdline", ppid);

    file = fopen(cmd, "r");

    if (file != NULL)
        while (fgets(cmd, SIZE, file) != NULL)
            printf("%s\n", cmd);

        fclose(file);

    return 0;
}

在bash文件中:

#!/bin/bash

./lol

我们称之为bash脚本:

bash lol.sh abc def

但是它仅返回“ bash”,而不返回命令的其余部分...

如何实现?

谢谢