getoptsは宣言されたパラメータの値を関数に渡します。

getoptsは宣言されたパラメータの値を関数に渡します。

スタンドアロンスクリプトとして関数があり、getoptsを持つ同じスクリプトにこの関数を入れて、値を関数に渡して出力を取得できるport.shかどうか疑問に思います。OPT_B

        OPT_B=B

        while getopts :a FLAG; do
          case $FLAG in
            b)  #set option "b"
             OPT_B=$OPTARG
              ;;
          esac
        done

    shift $((OPTIND-1))

!!-->> port $1 <<--!! -> OPT_B=$(port $1) ??

    function port()
     {
        if  [ "$1" = 'B' ]; then
        set $1=8000
        echo "declared value: $1"

        elif [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 -a "$1" -le 10000 ]; then
        echo "chosen value: $1"
        else echo "chosen value $1 is not in '1 - 10000'"
        fi
    return 0;
    }

ベストアンサー1

使用しないでくださいfunction port()。実際には意味がありません。 commandbashksh関数を宣言するときはfunctiontheを使用しませんが、()シェルはそれを許す構文として受け入れ、functionまったく使用していないかのように動作します。しないでください。

port()
    case ${1:--} in (B) OPT_B=8000;; (*[!0-9]*)
     !   printf 'chosen value %s not in %s\n' \
                "${1:-''}" "'1 - 10000'"      ;;
    (*)  [ "$(( $1>0 && $1<10001 ))" -ne 0 ]  &&
         echo "chosen value '$1'"             ||
         port "'$1'"                          ;;
    esac

これは関数を書くためのPOSIX正しい方法です。(上記の場合はエラー発生時に正しい返却が発生する場合を除く)。上記がシェルスクリプトにあり、$0とにかく関数を呼び出したい場合は、次のようにします。

eval "$(sed '/^port()/,$!d;/esac/q' /path/to/script_containing_port.sh)" 
port B #or whatever

^port()...このスクリプトで最初に現れる部分が、宣言したい関数の始まりを確実に示すと判断できると思います。それ以外の関数が独自のスクリプトにある場合は、次のようにします。

. /path/to/port.fn.sh; port B

最後に、スクリプトファイルの名前を指定しないでください。何か.sh実際にshスクリプトでない限り、つまりbashスクリプトを作成する場合は、名前を指定しないとsomething.bash意味がありません。

おすすめ記事