2013-12-17 1 views
0

위치 지정 인수 또는 명명 된 인수를 사용하려고 시도 할 수있는 Bash 함수를 작성 중입니다. 위치 지정 인수는 일반적으로 "${1}", "${2}" 방법 및 명명 된 인수는 getopts을 사용하여 액세스합니다. 아래에 표시된 예제 코드와 예제 사용법을 통해 내가하려는 것을 설명합니다. 문제는 변수 ${*}에서 수행하는 확인은 추가 인수의 문자 내용을 크게 제한하는 문자 -에 대한 grep에 불과하다는 것입니다. Bash에서 명명 된 인수를 확인하는 데 더 지능적이고 강력한 방법은 무엇입니까?Bash 함수는 위치 또는 이름 지정된 인수와 함께 사용되고 있는지 여부를 어떻게 감지 할 수 있습니까?

예제 코드 :

function1(){ 
    # flags 
     argumentsFlag1="" 
      # n: named arguments 
      # p: positional arguments 
     verboseFlag1="0" 
      # v: verbose 
     silentFlag1="0" 
      # 0: standard output 
      # 1: no standard output 
    # options and arguments 
     # Determine if positional or named arguments are used. 
      # If the arguments contain "-", then named arguments are assumed, 
      # otherwise positional arguments are assumed. 
       if [ "$(echo "${*}" | grep "-")" ]; then 
        argumentsFlag1="n" 
       else 
        argumentsFlag1="p" 
       fi 
     # handle named arguments 
      if [ "${argumentsFlag1}" == "n" ]; then 
       OPTIND=1; while getopts "i:sv" options; do 
        case "${options}" in 
         i) 
          input1="${OPTARG}" 
          ;; 
         v) 
          verboseFlag1=1 
          ;; 
         s) 
          silentFlag1=0 
          ;; 
         \?) 
          echo "invalid option -"${OPTARG}"" 
          return 
          ;; 
         :) 
          echo "option -"${OPTARG}" requires an argument" 
          return 
          ;; 
        esac 
       done 
     # handle positional arguments 
      elif [ "${argumentsFlag1}" == "p" ]; then 
       input1="${1}" 
     fi 
    # default values 
     if [ -z "${verboseFlag1}" ]; then 
      verboseFlag1=0 
     fi 
# ------------------------------------------------------------------------------ 
    if [ "${argumentsFlag1}" == "n" ]; then 
     echo "named arguments assumed" 
    elif [ "${argumentsFlag1}" == "p" ]; then 
     echo "positional arguments assumed" 
    fi 
    echo "input: "${input1}"" 
} 

사용 예 :

$ function1 zappo 
positional arguments assumed 
input: zappo 

$ function1 -i zappo 
named arguments assumed 
input: zappo 

편집 : 나는 동시에에 위치 및 명명 된 인수를 사용하려고하고 있지 않다 있습니다. 함수가 인수를 위치 또는 이름 인수의 혼합으로 해석 할 때만에 의해 인수를 해석하고있는 상태로 만들려고합니다. getopts이 사용되지 않는 경우가 있습니다. 다음 아이디어를 상상해보십시오 ...

하나의 데이터 유형에서 다른 유형으로 사용되는 함수가 있습니다.

이 모드는 다음과 같은 방식으로 사용될 수있다

빠른 모드 :이 함수는 두 가지 모드가 자율적 만들어진 내부 가정과 측정을 사용하여 다른 하나의 파일로 변환

function fileName1 fileName2 

.

고급 모드는

이 모드는 다음과 같은 방식으로 사용할 수 있습니다

function -i fileName1 -o fileName2 -m -r 100 -v 

가이 모드에서 사용되는 위치 인수 될 수 있지만, 그들은 getopts 위치 옵션 다음에 위치해야 및 인수.

답변

4

getopts을 사용하여 이름이 지정된 인수를 처리 할 때 스택에서 제외시킵니다. 이후에 남아 있다면, 그들은 당신의 입장에 대한 논증이다.

+0

여기에서 키 : [shift] (http://www.gnu.org/software/bash/manual/bashref.html#index-shift) -'shift $ ((OPTIND-1)) –

+0

I [이] (http://stackoverflow.com/a/13400237/1556092)와 같은 것을 의미한다고 생각하십니까? 그것은 좋은 생각이지만, 나는 동시에 명명 된 인자와 위치적인 인자를 사용하려하지 않는다. 함수의 상태를 전환하여 인수가 전적으로 위치 또는 완전히/부분적으로 해석되도록합니다. 한 가지에서 다른 것으로 변환하는 데 사용되는 함수를 상상해보십시오. 빠른 모드는 위치 인수 (''''function fileName1 fileName2''')를 사용하는 반면, 고급 모드는 해상도, 자세한 정보 등과 같은 다른 명세를 위해 명명 된 인수를 사용합니다. – d3pd

+0

그렇다면이 솔루션은 왜 작동하지 않을까요? 그것은 하나 또는 둘 모두를 처리합니다. 필요한 것보다 더 복잡하게 만드는 것처럼 들리는군요. – Donovan

관련 문제