getopts 将声明参数的值传递给函数

getopts 将声明参数的值传递给函数

我有port.sh作为独立脚本的函数,我想知道是否可以将此函数放在 getopts 所在的同一个脚本中,并将值传递到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()——它实际上没有任何意义。当使用命令声明bashorksh函数时function,您不使用 the()但 shell 接受它作为可原谅的语法哎呀,并且表现得就像您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 正确方法(除了上面出错时返回正确的情况)。如果以上内容在 shell 脚本中,并且$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.否则就没有意义。

相关内容