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(). 실제로는 아무 의미가 없습니다. command bashksh함수를 선언할 때 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하지 않으면 의미가 없습니다.

관련 정보