c - 在 C/C++ 中处理命令行标志

标签 c unix command-line-arguments

我正在寻找关于什么是标志的非常简单的解释/教程。我知道 flags work 指示命令做什么。例如:

rm -Rf test

我知道 rm 命令将删除测试文件夹,并且 -Rf 标志将强制命令不仅删除文件夹,还删除其中的文件。

但是,读取/编译的标志在哪里???什么处理标志?例如,我可以编写自己的 C/C++ 程序并指定不同的标志,以便程序执行不同的操作吗?我希望我问的是正确的问题。如果没有,请告诉我。

最佳答案

在 C 级别,程序的命令行参数出现在 main 函数的参数中。例如,如果你编译这个程序:

#include <stdio.h>
int main(int argc, char **argv)
{
    int i;
    for (i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);
    return 0;
 }

并使用与示例“rm”命令相同的参数调用它,您会得到:

$ ./a.out -Rf test
argv[0] = ./a.out
argv[1] = -Rf
argv[2] = test

如您所见,argv 中的第一个条目是程序本身的名称,其余数组条目是命令行参数。

操作系统根本不关心参数是什么;由您的程序来解释它们。但是,它们的工作方式有一些约定,其中最重要的是:

  • 参数分为选项非选项。选项以破折号开头,非选项则不然。
  • 选项,顾名思义,应该是可选的。如果您的程序需要一些命令行参数来执行任何有用的操作,那么这些参数应该是非选项(即它们应该以破折号开头)。
  • 选项可以进一步分为选项,即单个破折号后跟单个字母(-r-f) , 和 long 选项,它们是两个破折号后跟一个或多个破折号分隔的单词(--recursive, --frobnicate-the-gourds).可以将短选项组合成一个参数 (-rf),只要它们都不接受参数(见下文)。
  • 选项本身可以带参数。
    • short 选项 -x 的参数是 argv 条目的剩余部分,或者如果该条目中没有其他文本条目,下一个 argv 条目无论是否以破折号开头。
    • long 选项的参数以等号分隔:--output=outputfile.txt
  • 如果可能的话,不同选项(及其参数)的相对顺序应该没有明显的影响。
  • 特殊选项 -- 表示“不要将命令行上此点之后的任何内容视为选项,即使它看起来像一个选项。”例如,您可以通过键入 rm -- -f 删除名为“-f”的文件。
  • 特殊选项-表示“读取标准输入”。
  • 有许多按惯例保留的短选项字母:最重要的是
    • -v = 冗长
    • -q = 安静
    • -h = 打印一些帮助文本
    • -o file = 输出到file
    • -f = force(不提示确认危险操作,直接执行)

有很多库可以帮助您解析命令行参数。其中最便携但也是最受限制的是 getopt ,它内置在当今大多数系统的 C 库中。我建议您阅读 GNU argp 的所有文档即使您不想使用那个特定的,因为它会进一步让您了解约定。

还值得一提的是,通配符扩展 (rm -rf *) 是在您的程序被调用之前完成的。如果您在仅包含二进制文件及其源代码的目录中以 ./a.out * 的形式运行上述示例程序,您将获得

argv[0] = ./a.out
argv[1] = a.out
argv[2] = test.c

关于c - 在 C/C++ 中处理命令行标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14737957/

相关文章:

python - ArgumentParser.add_argument : How to use action parameter with custom type parameter?

c - 计算2^n的高精度程序

python - 使用Python过滤tail的输出

linux - unix - 文件中有多少条记录以及字符出现次数的分割

bash - Unix/bash。对于带有数字的文件名并行两个 for 循环

c - 在 C 程序中使用 arg[v] 命令行参数

go - 将优化标志传递给 Go 编译器?

c - 如何计算此循环完成后已运行了多少次?

c - While 循环带我去兜风(C 语言)!

c - 如何读取字符串并加倍文本文件,同时记录文件中的行数?