下面我将写一个简单的示例程序,它能够回显通过命令行参数传递给它的选项。它跟 Linux 的 echo命令类似,只不过我们的程序会打印出程序名。同时它还会调用puts函数将命令行选项按行打印输出。
#include
编译此程序,并在运行时提供一些命令行参数,你会看到传入的命令行参数被逐行打印出来:
$ ./echo this program can read the command lineargc=8./echothisprogramcanreadthecommandline
这个命令行将程序的 argc置为 8,**argv数组包含 8 个元素:程序名以及用户输入的 7 个单词。由于 C 语言中数组下标从 0 开始,所以这些元素的标号分别是 0 到 7。这也是在for循环中处理命令行参数时能够用i 作为比较条件的原因。
你也可以用这个方式实现自己的 cat或cp命令。cat命令的基本功能是显示一个或几个文件的内容。下面是一个简化版的cat命令,它从命令行获取文件名:
#include
这个简化版的 cat命令从命令行读取文件名列表,然后将各个文件的内容逐字符地显示到标准输出上。假定我有一个叫做hello.txt的文件,其中包含数行文本内容。我能用自己实现的cat命令将它的内容显示出来:
$ ./cat hello.txtHi there!This is a sample text file.
以这个简单程序为出发点,你也可以实现自己版本的其它 Linux 命令。比如 cp命令,它从命令行读取两个文件名:要读取的文件和要写入的文件。
读取命令行选项
通过命令行读取文件名和其它文本固然很棒,但是如果想要程序根据用户给出的选项改变行为呢?比如 Linux 的 cat命令就支持以下命令行选项:
下面看一个简单的例子。这个演示程序没有实现 cat命令的所有选项,但它只是能够解析命令行。每当发现一个合法的命令行选项,它就打印出相应的提示消息。在你自己的程序中,你可能会根据这些命令行选项执行变量赋值等者其它操作。
#include
假如你把程序编译为 args,你可以通过尝试不同的命令行参数组合,来了解程序是怎么解析短选项,以及是怎么将其它的命令行参数留下来的。最简单的例子是将所有的选项都放在最前面,就像这样:
$ ./args -b -T file1 file2Put line numbers next to non-blank linesShow tabs as ^I------------------------------file1file2
现在试试将两个短选项合并使用的效果:
$ ./args -bT file1 file2Put line numbers next to non-blank linesShow tabs as ^I------------------------------file1file2
如果有必要的话,getopt可以对命令行参数进行重排:
$ ./args -E file1 file2 -TShow the ends of lines as $Show tabs as ^I------------------------------file1file2
如果用户输入了错误的短选项,getopt会打印一条消息:
$ ./args -s -an file1 file2Suppress printing repeated blank lines./args: invalid option -- 'a'What's that??Put line numbers next to all lines------------------------------file1file2