दिलचस्प पोस्ट
एसी # सी की फ़्रेड फाइल I / O के बराबर इरादा एंड्रॉइड का उपयोग करके बिटमैप भेजें स्क्रीनशॉट की आईओएस जांच कैसे विंडोज 7 में अजगर पथ को जोड़ने के लिए? कंसोल में यूनिकोड वर्ण कैसे लिखेंगे? मैपकिट आईओएस के साथ ग्रेडियंट पॉलीलाइन ASP.NET कॉल करें PageMethod / jQuery के साथ WebMethod – पूरे पृष्ठ देता है #pragma सी + + 11 मानक का एक बार हिस्सा है? कैसे जावा में एक तेज और साफ तरीके से एक धागा को रोकना है? विंडोज़ में होस्टिंग जीआईटी रिपॉजिटरी एंड्रॉइड पर यूआरएल से छवि कैसे प्रदर्शित करें एंड्रॉइड – असीन्क टास्क को मजबूती से रद्द करें किया थारेसाइवरेमोटेशन जब पृष्ठभूमि में .NET में दिए गए ऐप के कई उदाहरणों को रोकें? डेटाबेस में उपयोगकर्ताओं के साथ प्रमाणीकरण / प्राधिकरण कैसे संभालना है?

कैसे getopts में उपयोग करने के उदाहरण bash

मैं इस तरह से myscript फ़ाइल कॉल करना चाहता हूँ:

 $ ./myscript -s 45 -p any_string 

या

 $ ./myscript -h >>> should display help $ ./myscript >>> should display help 

मेरी आवश्यकताएँ हैं:

  • इनपुट तर्क प्राप्त करने के लिए यहां प्राप्त करें
  • जांचें कि -s मौजूद है, यदि नहीं लौटाए त्रुटि
  • जांच लें कि -s बाद का मूल्य 45 या 90 है
  • जांचें कि -p मौजूद है और उसके बाद एक इनपुट स्ट्रिंग है
  • यदि उपयोगकर्ता प्रवेश करता है ./myscript -h या बस ./myscript तो मदद प्रदर्शित करें

मैंने अभी तक इस कोड की कोशिश की:

 #!/bin/bash while getopts "h:s:" arg; do case $arg in h) echo "usage" ;; s) strength=$OPTARG echo $strength ;; esac done 

लेकिन उस कोड के साथ मुझे त्रुटियां मिलती हैं I यह कैसे बाश और getopt साथ करने के लिए?

वेब के समाधान से एकत्रित समाधान "कैसे getopts में उपयोग करने के उदाहरण bash"

 #!/bin/bash usage() { echo "Usage: $0 [-s <45|90>] [-p <string>]" 1>&2; exit 1; } while getopts ":s:p:" o; do case "${o}" in s) s=${OPTARG} ((s == 45 || s == 90)) || usage ;; p) p=${OPTARG} ;; *) usage ;; esac done shift $((OPTIND-1)) if [ -z "${s}" ] || [ -z "${p}" ]; then usage fi echo "s = ${s}" echo "p = ${p}" 

उदाहरण चलाता है:

 $ ./myscript.sh Usage: ./myscript.sh [-s <45|90>] [-p <string>] $ ./myscript.sh -h Usage: ./myscript.sh [-s <45|90>] [-p <string>] $ ./myscript.sh -s "" -p "" Usage: ./myscript.sh [-s <45|90>] [-p <string>] $ ./myscript.sh -s 10 -p foo Usage: ./myscript.sh [-s <45|90>] [-p <string>] $ ./myscript.sh -s 45 -p foo s = 45 p = foo $ ./myscript.sh -s 90 -p bar s = 90 p = bar 

मूल कोड के साथ समस्या यह है कि:

  • h: पैरामीटर की उम्मीद है, जहां यह नहीं होना चाहिए, तो इसे सिर्फ h में बदलें (बिना बृहदान्त्र)
  • अपेक्षित करने के -p any_string , आपको जोड़ने की आवश्यकता है p: तर्क सूची में

getopts का मूल वाक्यविन्यास है (देखें: man bash ):

 getopts OPTSTRING VARNAME [ARGS...] 

कहा पे:

  • OPTSTRING अपेक्षित तर्कों की सूची के साथ स्ट्रिंग है,

    • h – पैरामीटर के बिना विकल्प- -h लिए जांच करें; असमर्थित विकल्प पर त्रुटि देता है;
    • h: – पैरामीटर के साथ विकल्प -h जांच करें; असमर्थित विकल्प पर त्रुटियां देता है;
    • abc – विकल्पों के लिए चेक -a , -b , -c ; असमर्थित विकल्प पर त्रुटियां देता है ;
    • :abc – विकल्पों के लिए चेक -a , -b , -c ; असमर्थित विकल्पों पर त्रुटियों को चुराने के लिए;

      नोट्स: दूसरे शब्दों में, विकल्प के सामने बृहदान्त्र आप अपने कोड में त्रुटियों को संभालने की अनुमति देता है परिवर्तनीय शामिल होंगे ? असमर्थित विकल्प के मामले में : लापता मूल्य के मामले में।

  • OPTARG – वर्तमान तर्क मान पर सेट है,

  • OPTERR – इंगित करता है कि क्या बश ने त्रुटि संदेश दिखाए।

तो कोड हो सकता है:

 #!/usr/bin/env bash usage() { echo "$0 usage:" && grep " .)\ #" $0; exit 0; } [ $# -eq 0 ] && usage while getopts ":hs:p:" arg; do case $arg in p) # Specify p value. echo "p is ${OPTARG}" ;; s) # Specify strength, either 45 or 90. strength=${OPTARG} [ $strength -eq 45 -o $strength -eq 90 ] \ && echo "Strength is $strength." \ || echo "Strength needs to be either 45 or 90, $strength found instead." ;; h | *) # Display help. usage exit 0 ;; esac done 

उदाहरण उपयोग:

 $ ./foo.sh ./foo.sh usage: p) # Specify p value. s) # Specify strength, either 45 or 90. h | *) # Display help. $ ./foo.sh -s 123 -p any_string Strength needs to be either 45 or 90, 123 found instead. p is any_string $ ./foo.sh -s 90 -p any_string Strength is 90. p is any_string 

देखें: बैश हैकर्स विकी के छोटे ट्यूटोरियल ट्यूटोरियल

getopt (मेरे distro /usr/share/getopt/getopt-parse.bash में डाल दिया) के साथ पैक किया गया उदाहरण दिखता है कि यह आपके सभी मामलों को शामिल करता है:

 #!/bin/bash # A small example program for using the new getopt(1) program. # This program will only work with bash(1) # An similar program using the tcsh(1) script language can be found # as parse.tcsh # Example input and output (from the bash prompt): # ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long " # Option a # Option c, no argument # Option c, argument `more' # Option b, argument ` very long ' # Remaining arguments: # --> `par1' # --> `another arg' # --> `wow!*\?' # Note that we use `"$@"' to let each command-line parameter expand to a # separate word. The quotes around `$@' are essential! # We need TEMP as the `eval set --' would nuke the return value of getopt. TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \ -n 'example.bash' -- "$@"` if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" while true ; do case "$1" in -a|--a-long) echo "Option a" ; shift ;; -b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;; -c|--c-long) # c has an optional argument. As we are in quoted mode, # an empty parameter will be generated if its optional # argument is not found. case "$2" in "") echo "Option c, no argument"; shift 2 ;; *) echo "Option c, argument \`$2'" ; shift 2 ;; esac ;; --) shift ; break ;; *) echo "Internal error!" ; exit 1 ;; esac done echo "Remaining arguments:" for arg do echo '--> '"\`$arg'" ; done 

मुझे पता है कि यह पहले से ही उत्तर दिया गया है, लेकिन रिकार्ड के लिए और उसी के साथ किसी के लिए भी मैंने इस संबंधित उत्तर को पोस्ट करने का फैसला किया। कोड को समझाने के लिए कोड को टिप्पणियों से भर दिया गया है।

अपडेट किया गया उत्तर:

फ़ाइल को getopt.sh रूप में getopt.sh :

 #!/bin/bash function get_variable_name_for_option { local OPT_DESC=${1} local OPTION=${2} local VAR=$(echo ${OPT_DESC} | sed -e "s/.*\[\?-${OPTION} \([A-Z_]\+\).*/\1/g" -e "s/.*\[\?-\(${OPTION}\).*/\1FLAG/g") if [[ "${VAR}" == "${1}" ]]; then echo "" else echo ${VAR} fi } function parse_options { local OPT_DESC=${1} local INPUT=$(get_input_for_getopts "${OPT_DESC}") shift while getopts ${INPUT} OPTION ${@}; do [ ${OPTION} == "?" ] && usage VARNAME=$(get_variable_name_for_option "${OPT_DESC}" "${OPTION}") [ "${VARNAME}" != "" ] && eval "${VARNAME}=${OPTARG:-true}" # && printf "\t%s\n" "* Declaring ${VARNAME}=${!VARNAME} -- OPTIONS='$OPTION'" done check_for_required "${OPT_DESC}" } function check_for_required { local OPT_DESC=${1} local REQUIRED=$(get_required "${OPT_DESC}" | sed -e "s/\://g") while test -n "${REQUIRED}"; do OPTION=${REQUIRED:0:1} VARNAME=$(get_variable_name_for_option "${OPT_DESC}" "${OPTION}") [ -z "${!VARNAME}" ] && printf "ERROR: %s\n" "Option -${OPTION} must been set." && usage REQUIRED=${REQUIRED:1} done } function get_input_for_getopts { local OPT_DESC=${1} echo ${OPT_DESC} | sed -e "s/\([a-zA-Z]\) [A-Z_]\+/\1:/g" -e "s/[][ -]//g" } function get_optional { local OPT_DESC=${1} echo ${OPT_DESC} | sed -e "s/[^[]*\(\[[^]]*\]\)[^[]*/\1/g" -e "s/\([a-zA-Z]\) [A-Z_]\+/\1:/g" -e "s/[][ -]//g" } function get_required { local OPT_DESC=${1} echo ${OPT_DESC} | sed -e "s/\([a-zA-Z]\) [A-Z_]\+/\1:/g" -e "s/\[[^[]*\]//g" -e "s/[][ -]//g" } function usage { printf "Usage:\n\t%s\n" "${0} ${OPT_DESC}" exit 10 } 

तो आप इसे इस तरह से उपयोग कर सकते हैं:

 #!/bin/bash # # [ and ] defines optional arguments # # location to getopts.sh file source ./getopt.sh USAGE="-u USER -d DATABASE -p PASS -s SID [ -a START_DATE_TIME ]" parse_options "${USAGE}" ${@} echo ${USER} echo ${START_DATE_TIME} 

पुराना उत्तर:

मुझे हाल ही में एक सामान्य दृष्टिकोण का उपयोग करने की आवश्यकता है मैं इस समाधान के साथ आया था:

 #!/bin/bash # Option Description: # ------------------- # # Option description is based on getopts bash builtin. The description adds a variable name feature to be used # on future checks for required or optional values. # The option description adds "=>VARIABLE_NAME" string. Variable name should be UPPERCASE. Valid characters # are [A-Z_]*. # # A option description example: # OPT_DESC="a:=>A_VARIABLE|b:=>B_VARIABLE|c=>C_VARIABLE" # # -a option will require a value (the colon means that) and should be saved in variable A_VARIABLE. # "|" is used to separate options description. # -b option rule applies the same as -a. # -c option doesn't require a value (the colon absense means that) and its existence should be set in C_VARIABLE # # ~$ echo get_options ${OPT_DESC} # a:b:c # ~$ # # Required options REQUIRED_DESC="a:=>REQ_A_VAR_VALUE|B:=>REQ_B_VAR_VALUE|c=>REQ_C_VAR_FLAG" # Optional options (duh) OPTIONAL_DESC="P:=>OPT_P_VAR_VALUE|r=>OPT_R_VAR_FLAG" function usage { IFS="|" printf "%s" ${0} for i in ${REQUIRED_DESC}; do VARNAME=$(echo $i | sed -e "s/.*=>//g") printf " %s" "-${i:0:1} $VARNAME" done for i in ${OPTIONAL_DESC}; do VARNAME=$(echo $i | sed -e "s/.*=>//g") printf " %s" "[-${i:0:1} $VARNAME]" done printf "\n" unset IFS exit } # Auxiliary function that returns options characters to be passed # into 'getopts' from a option description. # Arguments: # $1: The options description (SEE TOP) # # Example: # OPT_DESC="h:=>H_VAR|f:=>F_VAR|P=>P_VAR|W=>W_VAR" # OPTIONS=$(get_options ${OPT_DESC}) # echo "${OPTIONS}" # # Output: # "h:f:PW" function get_options { echo ${1} | sed -e "s/\([a-zA-Z]\:\?\)=>[A-Z_]*|\?/\1/g" } # Auxiliary function that returns all variable names separated by '|' # Arguments: # $1: The options description (SEE TOP) # # Example: # OPT_DESC="h:=>H_VAR|f:=>F_VAR|P=>P_VAR|W=>W_VAR" # VARNAMES=$(get_values ${OPT_DESC}) # echo "${VARNAMES}" # # Output: # "H_VAR|F_VAR|P_VAR|W_VAR" function get_variables { echo ${1} | sed -e "s/[a-zA-Z]\:\?=>\([^|]*\)/\1/g" } # Auxiliary function that returns the variable name based on the # option passed by. # Arguments: # $1: The options description (SEE TOP) # $2: The option which the variable name wants to be retrieved # # Example: # OPT_DESC="h:=>H_VAR|f:=>F_VAR|P=>P_VAR|W=>W_VAR" # H_VAR=$(get_variable_name ${OPT_DESC} "h") # echo "${H_VAR}" # # Output: # "H_VAR" function get_variable_name { VAR=$(echo ${1} | sed -e "s/.*${2}\:\?=>\([^|]*\).*/\1/g") if [[ ${VAR} == ${1} ]]; then echo "" else echo ${VAR} fi } # Gets the required options from the required description REQUIRED=$(get_options ${REQUIRED_DESC}) # Gets the optional options (duh) from the optional description OPTIONAL=$(get_options ${OPTIONAL_DESC}) # or... $(get_options "${OPTIONAL_DESC}|${REQUIRED_DESC}") # The colon at starts instructs getopts to remain silent while getopts ":${REQUIRED}${OPTIONAL}" OPTION do [[ ${OPTION} == ":" ]] && usage VAR=$(get_variable_name "${REQUIRED_DESC}|${OPTIONAL_DESC}" ${OPTION}) [[ -n ${VAR} ]] && eval "$VAR=${OPTARG}" done shift $(($OPTIND - 1)) # Checks for required options. Report an error and exits if # required options are missing. # Using function version ... VARS=$(get_variables ${REQUIRED_DESC}) IFS="|" for VARNAME in $VARS; do [[ -v ${VARNAME} ]] || usage done unset IFS # ... or using IFS Version (no function) OLDIFS=${IFS} IFS="|" for i in ${REQUIRED_DESC}; do VARNAME=$(echo $i | sed -e "s/.*=>//g") [[ -v ${VARNAME} ]] || usage printf "%s %s %s\n" "-${i:0:1}" "${!VARNAME:=present}" "${VARNAME}" done IFS=${OLDIFS} 

मैंने लगभग इस का परीक्षण नहीं किया, इसलिए मुझे वहां कुछ कीड़े हो सकती थीं।