Fab*_*mez 13 c unix command-line-arguments
我正在寻找关于标志是什么的非常简单的解释/教程.我知道标志工作表明命令该做什么.例如:
rm -Rf test
Run Code Online (Sandbox Code Playgroud)
我知道rm命令将删除测试文件夹,并且-Rf标志将强制命令不仅删除文件夹而且删除其中的文件.
但是,标志读取/编译在哪里?处理旗帜的是什么?例如,我可以编写自己的C/C++程序并指定不同的标志,以便程序执行不同的操作吗?我希望我提出正确的问题.如果没有,请告诉我.
zwo*_*wol 12
在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;
}
Run Code Online (Sandbox Code Playgroud)
并使用与示例'rm'命令相同的参数调用它,您得到:
$ ./a.out -Rf test
argv[0] = ./a.out
argv[1] = -Rf
argv[2] = test
Run Code Online (Sandbox Code Playgroud)
如您所见,第一个条目argv是程序本身的名称,其余的数组条目是命令行参数.
操作系统完全不关心参数是什么; 由您的程序来解释它们.但是,有关于它们如何工作的惯例,其中以下是最重要的:
-r,-f)和长选项,两个短划线后跟一个或多个短划线分隔的单词(--recursive,--frobnicate-the-gourds).-rf只要没有一个参数(参见下文),短选项可以拼凑成一个参数().-x是argv条目的其余部分,或者如果该条目中没有其他文本,则是下一个argv条目,无论它是否以短划线开头.--output=outputfile.txt.--意味着"不要在命令行上的这一点之后处理任何内容作为选项,即使它看起来像一个." 例如,您可以-f通过键入删除名为' ' 的文件rm -- -f.-意味着"读取标准输入".-v =啰嗦-q =安静-h =打印一些帮助文本-o file =输出到文件-f =强制(不要提示确认危险行为,只是这样做)有一堆库可以帮助您解析命令行参数.最便携,但也是最有限的是getopt,它现在在大多数系统的C库中内置.我建议您阅读GNU argp的所有文档,即使您不想使用该特定文档,因为它将进一步教育您遵守约定.
还值得一提的是,通配符扩展(rm -rf *)是在调用程序之前完成的.如果你运行上面的示例程序,就像./a.out *在一个只包含二进制文件和它的源代码的目录中那样
argv[0] = ./a.out
argv[1] = a.out
argv[2] = test.c
Run Code Online (Sandbox Code Playgroud)
abe*_*nky 11
这个简单的程序应该演示传递给程序的参数(包括程序名本身).
解析,解释和使用这些参数取决于程序员(您),尽管有可用的库可以提供帮助.
int main(int argc, char* argv[])
{
int i;
for(i=0; i<argc; ++i)
{ printf("Argument %d : %s\n", i, argv[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您将此程序编译为a.out,并将其运行为:
prompt$> ./a.out ParamOne ParamTwo -rf x.c
Run Code Online (Sandbox Code Playgroud)
你应该看到输出:
Argument 0 : a.out
Argument 1 : ParamOne
Argument 2 : ParamTwo
Argument 3 : -rf
Argument 4 : x.c
Run Code Online (Sandbox Code Playgroud)
实际上,您可以编写自己的 C++ 程序,它接受这样的命令行参数:
int main(int argc, char* argv[]){}
变量 argc 将包含参数的数量,而 char* 将包含参数本身。
您可以像这样调度参数:
for (int i = 1; i < argc; i++)
{
if (i + 1 != argc)
{
if (strcmp(argv[i], "-filename") == 0) // This is your parameter name
{
char* filename = argv[i + 1]; // The next value in the array is your value
i++; // Move to the next flag
}
}
}
Run Code Online (Sandbox Code Playgroud)