我正在编写一个Bash函数,它能够尝试使用位置或命名参数,从而以通常的"${1}"
,"${2}"
方式访问位置参数,并访问命名参数使用getopts
。我有一些示例代码和示例用法如下所示,以说明我正在尝试做什么。问题是我对变量${*}
进行的检查只是字符-
的一个grep,这极大地限制了其他参数的字符内容。在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
位置选项和参数之后。
答案 0 :(得分:4)
使用getopts
处理任何命名参数,并在执行此操作时将其从堆栈中移出。如果之后仍然存在,那么它们就是你的位置论证。