2013-12-17 12 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解释为位置参数和命名参数的混合。有没有使用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认为你的意思是诸如[this](http://stackoverflow.com/a/13400237/1556092)。这是个好主意,但我不想同时使用命名和位置参数;我试图切换函数的状态,以便将参数解释为单独位置或完全/部分命名。想象一下用于从一个事物转换到另一个事物的功能。快速模式将使用位置参数('''function fileName1 fileName2'''),而高级模式将使用其他规范的命名参数,例如分辨率,详细度等。 – d3pd

+0

那么为什么此解决方案不起作用?它处理一个或两个。听起来就像你试图让这个过程比需要的更复杂。 – Donovan