我正在写一个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
位置选项之后和论据。
关键在于:[shift](http://www.gnu.org/software/bash/manual/bashref.html#index-shift) - 'shift $((OPTIND-1))' –
I认为你的意思是诸如[this](http://stackoverflow.com/a/13400237/1556092)。这是个好主意,但我不想同时使用命名和位置参数;我试图切换函数的状态,以便将参数解释为单独位置或完全/部分命名。想象一下用于从一个事物转换到另一个事物的功能。快速模式将使用位置参数('''function fileName1 fileName2'''),而高级模式将使用其他规范的命名参数,例如分辨率,详细度等。 – d3pd
那么为什么此解决方案不起作用?它处理一个或两个。听起来就像你试图让这个过程比需要的更复杂。 – Donovan