0

コマンドラインを処理するために bash getopts を使用する方法を理解しようとしています。次のコードがあります。

    while getopts "e:n:t:s:h" opt
        do

            echo $opt
        done

次のような bash コマンド ラインで呼び出します。

. ./testopts.sh -e MyE -s sanctity

何も印刷されません。

助けてください

4

3 に答える 3

1

これは、引数処理に使用しているテンプレートです。

これは最適とは言えません (たとえば、組み込みの bash 正規表現の代わりに sed を使いすぎているなど) が、最初は使用できます。

#!/bin/bash

#define your options here
OPT_STR=":hi:o:c"

#common functions
err() { 1>&2 echo "$0: Error: $@"; return 1; }
required_arg() { err "Option -$1 need argument"; }
checkarg() { [[ "$1" =~ ${optre:--} ]] && { required_arg "$2"; return 1; } || { echo "$1" ; return 0; } }
phelp() { err "Usage: $0" "$(sed 's/^://;s/\([a-zA-Z0-9]\)/ -&/g;s/:/ [arg] /g;s/  */ /g' <<< "$OPT_STR")"; return 1; }

do_work() {
    echo "Here should go your script for processing $1"
}

## MAIN
declare -A OPTION
optre=$(sed 's/://g;s/.*/-[&]/' <<<"$OPT_STR")
while getopts "$OPT_STR" opt;
do
    #change here i,o,c to your options
    case $opt in
    i) OPTION[$opt]=$(checkarg "$OPTARG" $opt) || exit 1;;
    o) OPTION[$opt]=$(checkarg "$OPTARG" $opt) || exit 1;;
    c) OPTION[$opt]=1;;
    h) phelp || exit 1;;
    :) required_arg "$OPTARG" || exit 1 ;;
    \?) err "Invalid option: -$OPTARG" || exit 1;;
    esac
done

shift $((OPTIND-1))
#change here your options...
echo "iarg: ${OPTION[i]:-undefined}"
echo "oarg: ${OPTION[o]:-undefined}"
echo "carg: ${OPTION[c]:-0}"
echo "remainder args: =$@="

for arg in "$@"
do
    do_work "$arg"
done
于 2013-07-08T18:22:45.633 に答える