程序参数
当一个用C语言编写的Linux或UNIX程序运行时,它是从main函数开始的,main函数声明如下:
int main(int argc,char *argv[]) //argc 为程序参数的个数,argv是一个代表参数自身的字符串数组
无论操作系统何时启动一个程序,参数argc和argv都被设置并传递给main。这些参数通常由另一个程序提供,一般是shell程序。
shell程序接受用户输入的命令行,将命令行分解为单词,然后把这些单词放入argv数组。
tips:所有的命令行开关都应以一个短横线开头,其后包含单个字母或数字,如果需要,不带后续参数的选项可以在一个短横线后归并到一起。如果某个选项需要值,则该值应作为独立的参数紧跟在该选项后。
X/Open规范定义了命令行选项的标准用法,同时定义了在C语言中提供命令行开关的标准编程接口:getopt函数
为了帮助我们遵循命令行选项的标准用法,Linux提供了getopt函数,定义在unistd.h库里。支持需要关联值和不需要关联值的选项。
选项就是命令行可设置可不设置的参数
#include<unistd.h>
int getopt(int argc,char *argv[],const char *optstring); //返回值是argv数组中的下一个选项字符(如果有的话),循环调用getopt就可以依次得到每个选项
extern char *optarg;
extern int optind,opterr,optopt;
//optstring为选项指定符字符串,该字符串告诉getopt函数哪些选项可用,以及它们是否有关联值。
optstring是一个字符列表,每个字符代表一个单字符选项,如果一个字符后面紧跟一个冒号:,则表明该选项有一个关联值作为下一个参数
getopt有如下行为:
1. 如果选项有一个关联值,则外部变量optarg指向这个值
2. 如果选项处理完毕,getopt返回-1,特殊参数--将使getopt停止扫描选项
3. 如果遇到一个无法识别的选项,getopt返回一个问号?,并把它保存到外部变量optopt中
4. 如果一个选项要求有一个关联值,但用户并未提供这个值,getopt通常将返回一个问号?。如果我们将选项字符串的第一个字符设置为冒号:,那么getopt将在用户未提供值的情况下返回冒号:,而不是问号?。
外部变量optind被设置为下一个待处理参数的索引,getopt利用它来记录自己的进度。当所有选项参数都处理完毕后,optind将指向argv数组尾部可以找到其余参数的位置。
命令行参数有选项参数和其他参数,选项参数以‘-’开始
tips:有些版本的getopt会在第一个非选项参数处停下来,返回-1并设置optind的值,而其他一些版本,比如Linux提供的版本,能够处理出现在程序参数中任意位置的选项,在这种情况下,getopt实际重写了argv数组,把所有非选项参数都集中在一起,从argv[optind]开始