C getopt 及 shell getopts

来源:互联网 发布:中国工业数据库 编辑:程序博客网 时间:2024/05/29 00:30

 C

/*  * File:   getopt.c * Author: Vicky * * Created on 2012年2月3日, 上午10:34 */#include <stdio.h>#include <stdlib.h>#ifdef _WIN32extern int getopt(int, char * const *, const char *);extern char *optarg;#define snprintf _snprintf#else#include <unistd.h>#endif/* *  */int main(int argc, char **argv) {    int ch;    while ((ch = getopt(argc, argv, "n:p:")) != EOF) {        switch (ch) {            case 'n':/*                if (optarg[strlen(optarg) - 1] != '/' &&                        optarg[strlen(optarg) - 1] != '\\')                    return 1;*/                puts(optarg);                break;            case 'p':                puts(optarg);                break;            case '?':                puts("n name | p pswd !");                break;            default:                puts("no command or unknown!");                return 1;        }    }    return (EXIT_SUCCESS);}

注意在windows 下需要:getopt.c

 

/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1996, 2011 Oracle and/or its affiliates.  All rights reserved. *//* * Copyright (c) 1987, 1993, 1994 *The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id$ *//* * Avoid inclusion of internal header files as this * file is used by example code. * * Unconditional inclusion of stdio and string are * OK in this file.  It will work on all platforms * for which this file is used */extern char *__db_rpath(const char *);#include <stdio.h>#include <string.h>int__db_getopt_reset;/* global reset for VxWorks. */intopterr = 1,/* if error message should be printed */optind = 1,/* index into parent argv vector */optopt,/* character checked for validity */optreset;/* reset getopt */char*optarg;/* argument associated with option */#undefBADCH#defineBADCH(int)'?'#undefBADARG#defineBADARG(int)':'#undefEMSG#defineEMSG""/* * getopt -- *Parse argc/argv argument vector. * * PUBLIC: #ifndef HAVE_GETOPT * PUBLIC: int getopt __P((int, char * const *, const char *)); * PUBLIC: #endif */intgetopt(nargc, nargv, ostr)int nargc;char * const *nargv;const char *ostr;{static char *progname;static char *place = EMSG;/* option letter processing */char *oli;/* option letter list index *//* * VxWorks needs to be able to repeatedly call getopt from multiple * programs within its global name space. */if (__db_getopt_reset) {__db_getopt_reset = 0;opterr = optind = 1;optopt = optreset = 0;optarg = NULL;progname = NULL;place = EMSG;}if (!progname) {if ((progname = __db_rpath(*nargv)) == NULL)progname = *nargv;else++progname;}if (optreset || !*place) {/* update scanning pointer */optreset = 0;if (optind >= nargc || *(place = nargv[optind]) != '-') {place = EMSG;return (EOF);}if (place[1] && *++place == '-') {/* found "--" */++optind;place = EMSG;return (EOF);}}/* option letter okay? */if ((optopt = (int)*place++) == (int)':' ||    !(oli = strchr(ostr, optopt))) {/* * if the user didn't specify '-' as an option, * assume it means EOF. */if (optopt == (int)'-')return (EOF);if (!*place)++optind;if (opterr && *ostr != ':')(void)fprintf(stderr,    "%s: illegal option -- %c\n", progname, optopt);return (BADCH);}if (*++oli != ':') {/* don't need argument */optarg = NULL;if (!*place)++optind;}else {/* need an argument */if (*place)/* no white space */optarg = place;else if (nargc <= ++optind) {/* no arg */place = EMSG;if (*ostr == ':')return (BADARG);if (opterr)(void)fprintf(stderr,    "%s: option requires an argument -- %c\n",    progname, optopt);return (BADCH);}else/* white space */optarg = nargv[optind];place = EMSG;++optind;}return (optopt);/* dump back option letter */}


 

 

shell

#!/bin/bash# # File:   getopts.bash# Author: Vicky.H## Created on 2012-2-3, 10:52:12## ./getopts.bash -s 60 -m 1 -h 1#SECS=0MINTES=0HOURS=0DAYS=0RPOCESS=    # NULLwhile getopts :s:m:h:d:p TIMED 2>/dev/nulldo    case $TIMED in        s) SECS=$OPTARG            ;;        m) (( MINTES = $OPTARG * 60 ))            ;;        h) (( HOURS = $OPTARG * 3600 ))            ;;        d) (( DAYS = $OPTARG * 86400 ))            ;;        p) RPOCESS = $OPTARG            ;;        \?) usage            ;;    esacdone(( TOTAL_SECONDS = SECS + MINTES + HOURS + DAYS ))echo $TOTAL_SECONDS

原创粉丝点击