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

Forheadと私は 'と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オプションの全体プロセスを再度実行することを意味します。実際、両方の場所で同じプロセスを実装できます。無効なオプションを返すエラーはどうですかplistpregion一部のオプションは許可されていますが許可されていない可能性があるため、電話をかけるかどうかを決定するまでこれを行うことはできません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やforpregionなどのリストの静的位置から値を取得できます。$1$this$2$that

また、ところでshift 2そこを使うのは危険ですよ。シェルによっては、変換する引数が不足して自動的に失敗することもあります。たとえば、set a b c; shift 4; echo $1Dashではエラーが発生して終了しますが、Bashではa。ユーザーがオプション・パラメーターなしでオプションを指定すると、オプションの構文解析がループになる可能性があります。

関連情報