Linux main 命令行参数解析最好用的例子

或许是我见得少,反正这是目前遇到最好命令行参数例子,下面给出源码及简单介绍:

第一部分:主要是声明一个结构体,将解析到的参数放在结构体中,同时还给出一个默认参数;

 16 #include <getopt.h>

 61 typedef struct Args {
 62     VideoStd_Type  videoStd;
 63     Char          *videoStdString;
 64     Sound_Input    soundInput;
 65     Capture_Input  videoInput;
 66     Char          *speechFile;
 67     Char          *videoFile;
 68     Codec         *speechEncoder;
 69     Codec         *videoEncoder;
 70     Int32          imageWidth;
 71     Int32          imageHeight;
 72     Int            videoBitRate;
 73     Int            keyboard;
 74     Int            time;
 75     Int            osd;
 76     Int            interface;
 77 } Args;
 78
 79 #define DEFAULT_ARGS \
 80     { VideoStd_D1_NTSC, "D1 NTSC", Sound_Input_MIC, Capture_Input_COMPOSITE, \
 81       NULL, NULL, NULL, NULL, 0, 0, -1, FALSE, FOREVER, FALSE, FALSE }


第二部分:核心部分,标准的信息打印,和命令行参数解析函数


118 /******************************************************************************
119  * usage
120  ******************************************************************************/
121 static void usage(void)
122 {
123     fprintf(stderr, "Usage: encode [options]\n\n"
124       "Options:\n"
125       "-s | --speechfile       Speech file to record to\n"
126       "-v | --videofile        Video file to record to\n"
127       "-y | --display_standard Video standard to use for display (see below).\n"
128       "-r | --resolution       Video resolution ('width'x'height')\n"
129       "                        [video standard default]\n"
130       "-b | --videobitrate     Bit rate to encode video at [variable]\n"
131       "-x | --svideo           Use s-video instead of composite video \n"
132       "                        input [off]\n"
133       "-l | --linein           Use linein for encoding sound instead of mic \n"
134       "                        [off]\n"
135       "-k | --keyboard         Enable keyboard interface [off]\n"
136       "-t | --time             Number of seconds to run the demo [infinite]\n"
137       "-o | --osd              Show demo data on an OSD [off]\n"
138       "-i | --interface        Launch the demo interface when exiting [off]\n"
139       "-h | --help             Print this message\n\n"
140       "Video standards available:\n"
141       "\t1\tD1 @ 30 fps (NTSC) [Default]\n"
142       "\t2\tD1 @ 25 fps (PAL)\n"
143       "\t3\t720P @ 60 fps\n"
144       "\t4\t720P @ 50 fps\n"
145       "\t5\t1080I @ 30 fps [Not supported for DM365]\n"
146       "\t6\t1080I @ 25 fps [Not supported for DM365]\n"
147       "You must supply at least a video or a speech file or both\n"
148       "with appropriate extensions for the file formats.\n\n");
149 }
150

核心部分:参数解析的时候分短选项和长选项,那么shortOptions与longOptions就对应与两者,

其中shortOptions选项中如果加了“:”冒号,那么就需要带参数,而longOptions中通过“ required_argument”

与“  no_argument“来进行区分,最后把这两个参数传递给getopt_long函数就能逐一返回一个个选项,再根据选项

得到对应的参数,并将其存放在结构体中,整个过程就这样了;


151 /******************************************************************************
152  * parseArgs
153  ******************************************************************************/
154 static Void parseArgs(Int argc, Char *argv[], Args *argsp)
155 {
156     const Char shortOptions[] = "s:v:y:r:b:xlkt:oih";
157     const struct option longOptions[] = {
158         {"speechfile",       required_argument, NULL, 's'},
159         {"videofile",        required_argument, NULL, 'v'},
160         {"display_standard", required_argument, NULL, 'y'},
161         {"resolution",       required_argument, NULL, 'r'},
162         {"videobitrate",     required_argument, NULL, 'b'},
163         {"svideo",           no_argument,       NULL, 'x'},
164         {"linein",           no_argument,       NULL, 'l'},
165         {"keyboard",         no_argument,       NULL, 'k'},
166         {"time",             required_argument, NULL, 't'},
167         {"osd",              no_argument,       NULL, 'o'},
168         {"interface",        no_argument,       NULL, 'i'},
169         {"help",             no_argument,       NULL, 'h'},
170         {0, 0, 0, 0}
171     };
172
173     Int     index;
174     Int     c;
175     Char    *extension;
176
177     for (;;) {
178         c = getopt_long(argc, argv, shortOptions, longOptions, &index);
179
180         if (c == -1) {
181             break;
182         }
183
184         switch (c) {
185             case 0:
186                 break;
187
188             case 's':
189                 extension = rindex(optarg, '.');
190                 if (extension == NULL) {
191                     fprintf(stderr, "Speech file without extension: %s\n",
192                             optarg);
193                     exit(EXIT_FAILURE);
194                 }
195
196                 argsp->speechEncoder =
197                     getCodec(extension, engine->speechEncoders);
198
199                 if (!argsp->speechEncoder) {
200                     fprintf(stderr, "Unknown speech file extension: %s\n",
201                             extension);
202                     exit(EXIT_FAILURE);
203                 }
204                 argsp->speechFile = optarg;
205
206                 break;

....


305             case 't':

306                 argsp->time = atoi(optarg);
307                 break;
308
309             case 'o':
310                 argsp->osd = TRUE;
311                 break;
312
313             case 'i':
314                 argsp->interface = TRUE;
315                 break;
316
317             case 'h':
318                 usage();
319                 exit(EXIT_SUCCESS);
320
321             default:
322                 usage();
323                 exit(EXIT_FAILURE);
324         }
325     }
326
327     if (argsp->videoInput != Capture_Input_SVIDEO) {
328         if (argsp->videoStd == VideoStd_D1_NTSC || argsp->videoStd == VideoStd_D1_PAL ) {
329             argsp->videoInput = Capture_Input_COMPOSITE;
330         } else {
331             argsp->videoInput = Capture_Input_COMPONENT;
332         }
333     }
334
335     /* Need at least one file to decode and only one sound file */
336     if (!argsp->videoFile && !argsp->speechFile) {
337         usage();
338         exit(EXIT_FAILURE);
339     }

340 }

第三部分:主函数调用部分


388 /******************************************************************************
389  * main
390  ******************************************************************************/
391 Int main(Int argc, Char *argv[])
392 {
393     Args                args                = DEFAULT_ARGS;
426     /* Parse the arguments given to the app and set the app environment */
427     parseArgs(argc, argv, &args);
428 }

注意:头文件为 #include <getopt.h>,man 到的信息如下:

相关推荐