我要寻找一个非常简单的解释/教程上什么标志。 据我所知,标志工作指示命令做什么。 例如:
rm -Rf test
我知道,rm命令将删除test文件夹,而且-Rf标志将强制命令删除不只是文件夹,但在它的文件。
但是,这里是一个标志读/编译??? 什么处理的标志吗? 可我举个例子,我自己写的C / C ++程序,并指定不同的标志,使程序在做不同的事情? 我希望我提出正确的问题。 如果没有,请让我知道。
我要寻找一个非常简单的解释/教程上什么标志。 据我所知,标志工作指示命令做什么。 例如:
rm -Rf test
我知道,rm命令将删除test文件夹,而且-Rf标志将强制命令删除不只是文件夹,但在它的文件。
但是,这里是一个标志读/编译??? 什么处理的标志吗? 可我举个例子,我自己写的C / C ++程序,并指定不同的标志,使程序在做不同的事情? 我希望我提出正确的问题。 如果没有,请让我知道。
这个简单的程序应该证明传递给程序的参数(包括程序名称本身)。
解析,解释和使用这些参数是由程序员(你),虽然也有可以帮助库。
int main(int argc, char* argv[])
{
int i;
for(i=0; i<argc; ++i)
{ printf("Argument %d : %s\n", i, argv[i]);
}
return 0;
}
如果您编译这个程序到a.out
,并运行它为:
prompt$> ./a.out ParamOne ParamTwo -rf x.c
你应该看到的输出:
Argument 0 : a.out
Argument 1 : ParamOne
Argument 2 : ParamTwo
Argument 3 : -rf
Argument 4 : x.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
),以及长选项,这是两个短划线,接着通过一个或多个划线分隔单词( --recursive
, --frobnicate-the-gourds
)。 短选项可以一起glommed到一个参数( -rf
),只要他们没有接受参数(见下文)。 -x
要么是在剩余argv
项,或者如果该条目没有进一步的文字,在第二天argv
条目是否它以短划线开头。 --output=outputfile.txt
。 --
意思是“命令行选项这一点后,不把任何东西,哪怕它看起来像一个”。 之所以如此,例如,你可以删除一个文件名为“ -f
通过键入” rm -- -f
。 -
意思是“读标准输入”。 -v
=是冗长 -q
=安静 -h
=打印帮助文本 -o
文件 =输出到文件 -f
=力(不提示危险行为的确认,只是做他们) 还有一堆帮助您解析命令行参数的库。 最便携,但也最有限的,这些是getopt的 ,这是时下内置到C库在大多数系统上。 我建议你阅读所有的文档GNU argp ,即使你不想使用特定的一个,因为它会进一步教育你的约定。
另外值得一提的是通配符扩展( rm -rf *
是不断调用程序之前 )完成。 如果运行上面的示例程序如./a.out *
在目录仅包含二进制和它的源代码,你会得到
argv[0] = ./a.out
argv[1] = a.out
argv[2] = test.c
其实你可以写自己的C ++ PROGRAMM它接受这样的命令行参数:
int main(int argc, char* argv[]){}
变量ARGC包含的参数的数目,而字符*将包含参数本身。
你可以派遣这样的参数:
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
}
}
}
在自己的C程序,你可以处理在您认为合适的任何方式的命令行选项。 在C命令行参数来在主的参数(INT的argc,字符* argv的[])方法为字符串。
如果你想在类似于大多数UNIX命令的方式来处理命令行参数,你可能寻找的功能是getopt的()
祝好运!
最简单的办法就是先写你main()
如下所示:
INT主(INT的argc,字符* argv的[]){...
然后是主内你决定什么发生在命令行参数或“标志”。 您argv中找到他们,他们的数量是ARGC。
标志是传递到程序的主入口点的参数。 例如,在C ++程序,你可以有
int main(int arc, char* argv[]){
return 0;
}
您的电弧的传递参数的#,指针插上U的实际参数列表。 因此对于
rm -Rf test
ARGC是3,和argv数组将包含你的论点。 通知的argc> = 1,因为该程序名称本身计数(RM)。 -RF是你的第二个参数和测试是你的第三个。
所以每当你在UNIX输入命令,你基本上是正在执行的程序,并通过他们,他们的操作参数。
如果你真的在UNIX操作系统很感兴趣,你应该看看了叉以及它们如何工作。 这可以得到相当混乱新人的,所以只有当你在OS真正感兴趣和程序是如何执行的。
GNU libc的,这是你的系统很可能使用,为这些所谓的getopt可以用来解析以一种合理的方式选择一个库。 有让你下面链接的文档中开始的例子。
http://www.gnu.org/software/libc/manual/html_node/Getopt.html#Getopt