Bash 함수는 사용자 정의 옵션을 전달해야 하는 다른 함수를 호출합니다.

Bash 함수는 사용자 정의 옵션을 전달해야 하는 다른 함수를 호출합니다.

plisthead전화를 걸고 명령을 내릴 수 있는 기능이 있습니다 tail. 하지만 해당 영역을 처리하기 위해 다른 함수를 호출했습니다 pregion.

# --- plist ---

  ("-H"|"--head")
    local -r hn="$2" ; shift 2 ;;
  ("-T"|"--tail")
    local -r tm="$2" ; shift 2 ;;

  ("--FS")                           # field separator
    local fs="$2" ; shift 2 ;;
  ("--incl")
    local incl+=("$2") ; shift 2 ;;  # file type suffix
  ("--excl")
    local excl+=("$2") ; shift 2 ;;  # file type suffix

  ("--RP")
    local pn=$2 ; shift 2 ;;
  ("--RQ")
    local qn=$2 ; shift 2 ;;

  ("--dyn"|"--dynamic")
    local dyn="1" ; shift 1 ;;
  ("-C"|"--context")
    local ctx=$2 ; shift 2 ;;

  ("-d"|"--directory")
    local fdir=$2 ; shift 2 ;;

  (--)
    shift;  break  ;;

  ...

  if [[ -v hn ]]; then

     head -v -hn "$n"
    
  elif [[ -v tm ]]; then

    tail -v -n "$tm"

  elif [[ -v dyn ]]; then

    pregion "$@"  # requires original options here

  fi

For head및 저는 ' , 및 tail' 옵션을 사용합니다 . options 을 처리할 때 을 사용하고 있기 때문에 단순히 에 전달할 수 없기 때문에 원래 입력 매개변수의 복사본이 필요합니다 .-H-T--FS--inclshiftplist"$@"pregion

이것은 전화 head하거나tail

  plist -H 8 ./01cuneus

  plist -T 13 ./01cuneus

통화 예시pregion

plist --dyn -C 8 "Martin" ./01cuneus

plist --incl .texi --incl .org --RP 8 --RQ 13 ./01cuneus

plist --incl .texi --incl .org --dyn -C 8 "Martin" ./01cuneus

답변1

원래 매개변수를 배열에 복사하고 이를 pregion.

plist() {
  local -a origargs=("$@")
  ...
  case
    ...
  esac
  ...

  if
    ...
  elif [[ -v dyn ]]; then
    pregion "${origargs[@]}"
  fi

답변2

실제로 내용을 저장할 수 있습니다 $@.

plist() {
    local args
    args=("$@")
    case $1 in ...
        # some shifting etc.
    esac
    if something; then
        pregion "${args[@]}"
    fi
}

그러나 이는 pregion전체 옵션 프로세스를 다시 거치는 것을 의미합니다. 실제로 두 곳에서 동일한 프로세스를 구현할 수 있습니다. 유효하지 않은 옵션을 반환하는 오류는 어떻습니까 plist? pregion일부 옵션은 허용되지만 허용되지 않을 수 있으므로 전화할지 여부를 결정할 때까지는 그렇게 할 수 없습니다 plist.

대신 옵션 구문 분석을 한 번만 수행한 다음 pregion개별 인수로 구문 분석된 적절한 값을 사용하여 호출하는 것이 좋습니다.

plist() {
    local args
    args=("$@")
    local this=default that=otherdefault
    local call_pregion=
    case $1 in ...
        this) this=$2; shift; shift;;
        that) that=$2; shift; shift;;
        dyn) call_pregion=1
    esac
    if [ "$call_pregion" ]; then
        pregion "$this" "$that"
    fi
}

이를 통해 for 및 for pregion와 같은 목록의 정적 위치에서 값을 가져올 수 있습니다 .$1$this$2$that

또, 그런데 shift 2거기를 사용하는 것은 위험해요. 셸에 따라 변환할 인수가 부족하여 자동으로 실패할 수도 있습니다. 예를 들어 set a b c; shift 4; echo $1Dash에서는 오류가 발생하고 종료되지만 Bash에서는 a. 사용자가 해당 옵션 매개변수 없이 옵션을 제공하면 옵션 구문 분석이 루프에 걸릴 수 있습니다.

관련 정보