【问题标题】:Problem to pass argument from bash script to C program [closed]将参数从 bash 脚本传递到 C 程序的问题[关闭]
【发布时间】:2019-10-17 19:13:48
【问题描述】:

我在将参数从 bash 文件传递​​到 C 程序时遇到了一些问题。 我正在使用 bash 脚本来编译这样的 C 程序:

gcc -O0 filec1.c -lm -o fileoutput
./fileoutput $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11

现在,如果我在 bash 文件中打印每个参数,添加以下行:

for i in $@; do
    echo $i
done

传递的每个参数都被正确打印,但是如果我打印 c 文件中的每个参数,它只有一个带有以下行的 main:

int main(int argc, char **argv){
    for(int i=0; i<argc; i++){
        printf("%s\n", argv[i]);
    }
}

9th 之后的参数输出错误或未打印。 有人可以帮帮我吗?

【问题讨论】:

  • 请附上您的问题的minimal, reproducible example。就你现在的问题而言,几乎不可能知道这里到底出了什么问题。
  • 另外,你能清楚地解释你认为错了什么以及你期望它做什么。仅仅说“它是错误的”实际上只会导致回复“它只是在做你告诉它做的事情”。这是令人沮丧的,因为您知道自己想做什么,但无法将其输入机器-它无法读懂您的想法。不幸的是,我们也无法读懂您的想法,因此您需要清楚地说明问题。此外,FWIW,从命令行运行命令并传递 $1 $2 等参数是不寻常的。 通常这些“参数”只有在 bash 脚本中才有意义。
  • C 程序是什么样的?你是如何处理这些论点的?
  • 9 以上的编号参数需要大括号,例如${10} ${11} ${12} 等。如果您不使用大括号,它将使用单个数字参数后跟文字数字。例如$12 将给出$1 的值,后跟文字2

标签: c bash


【解决方案1】:

如果您在 bash 脚本中引用 bash 参数,您可以使用 "$@" 它不是单独的参数,而是扩展到您传递给它的任何参数。

编辑

https://stackoverflow.com/a/3898681/152016 参考 bash 手册页,解释该特殊变量的含义,还有其他有用的变量,如 $#$?

感谢@DanielPryden 评论,在变量周围添加了引号。在这里查看一个很好的解释:https://stackoverflow.com/a/3990540/152016

【讨论】:

  • @DanielPryden 有必要吗?
  • 对于反对者,我已经编辑了答案。
  • @Niloct:是的,如果你想在参数中保留空格和特殊字符,引号是必要的。
  • @DanielPryden 我已经尝试了答案最后一个链接中的代码,但得到了不同的结果。如果您不向脚本提供带引号的参数,则不会在 $@ 中保留带/不带引号的特殊字符。当您提供带引号的参数时,"$@"$@ 的行为是相同的。您是否知道显示差异的测试用例?谢谢。
  • @Niloct:听起来你想问一个新问题。在这种情况下,请继续提问。但我只想强调,您需要了解传递给子进程的实际值(如 C 中的 argv)与您在命令行上编写的不同。如果在 shell 中使用引号,那只会影响 shell 如何将字符串解析为字符串数组;引号字符本身不包含在传递给子进程的字符串中。
猜你喜欢
  • 2021-07-11
  • 2015-01-29
  • 2014-10-04
  • 2019-03-11
  • 2021-02-12
  • 1970-01-01
  • 2018-09-24
  • 2011-10-10
  • 2018-03-11
相关资源
最近更新 更多