使用位置参数和 1 个命名参数的组合
using a combination of positional parameters and 1 named parameter
我仍然 "baking" 我的 shell 具有这些功能,所以我的问题听起来可能不像 "totally ready" ..它更像是 "whats the best way to design this" 而不是 "I ran into this error or this wont work..now what do I do ",所以请耐心等待。当我解释
我正在考虑一个 shell 程序,它可以 运行 两种模式
- 标准模式是一堆位置参数
例如myprogram date1 date2 date3 date4 # can go on indefinitely
- 命名参数模式
myprogram -r date1 # Just 1 date para allowed
他们当然是互斥的myprogram date1 date2 date3 date4
没关系
myprogram -r date1 date2 date3 date4
不是因为 -r
只需要 1 个参数
我知道 getopts
提供命名参数功能,可以 shift
通过一系列选项。
我已经准备好标准模式并可以正常工作,我想 "add" 到代码以获取命名参数模式
在标准模式下,我的代码模式类似于
for args
do
stuff that I want done here
shift
done
这就是我对命名参数模式逻辑的思考
(当我使用 getopts 并且使用了超过 1 个位置参数时,它应该退出。)
getopts 只允许 1 个参数,我正在考虑这样的参数
while getopts "r:" opt;
do
case statement of getopts
<stuff I want to do >
esac
done
为了将位置参数限制为 1,我应该有这样的东西吗?
[ "$#" -eq 2 ] || die " more than 1 para not expected here"
2 是因为当我在上面的 while 循环中时,-r
是第一个位置。 para 和 1 para 是进入其中的变量。我必须在循环内进行检查,因为如果未使用 -r
选项,我希望它在不执行任何操作的情况下失败,在这种情况下,我可以根据需要拥有尽可能多的 pos 参数
那么我如何做这道菜最好——这就是我想要了解的。
将 getopts
代码放在第一位,然后跟进位置参数代码 ?
对不起,如果我的问题太具体了。
我使用 getopts
而不是 getopt
但我认为逻辑是相同的。循环指定的选项,完成后,如果您还没有设置选项,只需使用剩余的选项即可。
ARGS=$(getopt --options=r: --name="[=10=]" -- "$@");
if [ $? -ne 0 ]; then
echo_usage
exit 1
fi
eval set -- "$ARGS";
while true; do
case in
-r)
shift
date1=
;;
done
if [ -z "$date1" -a ! -z "" ]; then
date1=
fi
我并不总是使用 getopts,但当我使用时,它看起来像这样:
...
#Defaults
Verbose=false
ropt=false
# Options
while getopts vr: opt; do
case "$opt" in
v) Verbose=true; vopt="-v" ;;
r) ropt=true; rarg="$OPTARG" ;;
*) usage; exit 1 ;;
esac
done
shift $((OPTIND - 1))
if $ropt && [ $# -gt 0 ]; then
$Verbose && echo "Too many arguments. Bye." >&2
exit 1
elif $ropt; then
args=( "$rarg" )
else
args=( "$@" )
fi
# then...
for thing in "$args"; do
... something with $thing ...
done
getopts 循环后的第一个条件控制您是 运行 处于多参数还是单参数 (-r
) 模式。随后的 else
s 填充 $args
数组,您可以稍后对其进行任何操作。
我仍然 "baking" 我的 shell 具有这些功能,所以我的问题听起来可能不像 "totally ready" ..它更像是 "whats the best way to design this" 而不是 "I ran into this error or this wont work..now what do I do ",所以请耐心等待。当我解释
我正在考虑一个 shell 程序,它可以 运行 两种模式
- 标准模式是一堆位置参数
例如myprogram date1 date2 date3 date4 # can go on indefinitely
- 命名参数模式
myprogram -r date1 # Just 1 date para allowed
他们当然是互斥的myprogram date1 date2 date3 date4
没关系
myprogram -r date1 date2 date3 date4
不是因为 -r
我知道 getopts
提供命名参数功能,可以 shift
通过一系列选项。
我已经准备好标准模式并可以正常工作,我想 "add" 到代码以获取命名参数模式
在标准模式下,我的代码模式类似于
for args
do
stuff that I want done here
shift
done
这就是我对命名参数模式逻辑的思考
(当我使用 getopts 并且使用了超过 1 个位置参数时,它应该退出。)
getopts 只允许 1 个参数,我正在考虑这样的参数
while getopts "r:" opt;
do
case statement of getopts
<stuff I want to do >
esac
done
为了将位置参数限制为 1,我应该有这样的东西吗?
[ "$#" -eq 2 ] || die " more than 1 para not expected here"
2 是因为当我在上面的 while 循环中时,-r
是第一个位置。 para 和 1 para 是进入其中的变量。我必须在循环内进行检查,因为如果未使用 -r
选项,我希望它在不执行任何操作的情况下失败,在这种情况下,我可以根据需要拥有尽可能多的 pos 参数
那么我如何做这道菜最好——这就是我想要了解的。
将 getopts
代码放在第一位,然后跟进位置参数代码 ?
对不起,如果我的问题太具体了。
我使用 getopts
而不是 getopt
但我认为逻辑是相同的。循环指定的选项,完成后,如果您还没有设置选项,只需使用剩余的选项即可。
ARGS=$(getopt --options=r: --name="[=10=]" -- "$@");
if [ $? -ne 0 ]; then
echo_usage
exit 1
fi
eval set -- "$ARGS";
while true; do
case in
-r)
shift
date1=
;;
done
if [ -z "$date1" -a ! -z "" ]; then
date1=
fi
我并不总是使用 getopts,但当我使用时,它看起来像这样:
...
#Defaults
Verbose=false
ropt=false
# Options
while getopts vr: opt; do
case "$opt" in
v) Verbose=true; vopt="-v" ;;
r) ropt=true; rarg="$OPTARG" ;;
*) usage; exit 1 ;;
esac
done
shift $((OPTIND - 1))
if $ropt && [ $# -gt 0 ]; then
$Verbose && echo "Too many arguments. Bye." >&2
exit 1
elif $ropt; then
args=( "$rarg" )
else
args=( "$@" )
fi
# then...
for thing in "$args"; do
... something with $thing ...
done
getopts 循环后的第一个条件控制您是 运行 处于多参数还是单参数 (-r
) 模式。随后的 else
s 填充 $args
数组,您可以稍后对其进行任何操作。