Linux getopt不';不支持Bash中选项之间的空格?
因此,我的getopt代码如下所示:Linux getopt不';不支持Bash中选项之间的空格?,linux,bash,getopt,Linux,Bash,Getopt,因此,我的getopt代码如下所示: ARG_H=0 ARG_V=0 ARG_A=0 ARG_N=5 TEMP=`getopt -o hvn:a -n "vdu" -- "$1"` eval set -- "$TEMP" while true ; do case "$1" in -h|--argh) ARG_H=1 ; shift ;;
ARG_H=0
ARG_V=0
ARG_A=0
ARG_N=5
TEMP=`getopt -o hvn:a -n "vdu" -- "$1"`
eval set -- "$TEMP"
while true ; do
case "$1" in
-h|--argh) ARG_H=1 ; shift ;;
-v|--argv) ARG_V=1 ; shift ;;
-n|--argn)
case "$2" in
"") shift 2 ;;
*) ARG_N=$2 ; shift 2 ;;
esac ;;
-a|--arga) ARG_A=1 ; shift ;;
--) shift ; break ;;
*) echo "error" ; exit 1 ;;
esac
done
echo "$ARG_H"
echo "$ARG_V"
echo "$ARG_N"
echo "$ARG_A"
./vdu -a-v-n15
但出于某种原因,只有当我的命令行如下所示时,它才起作用:
ARG_H=0
ARG_V=0
ARG_A=0
ARG_N=5
TEMP=`getopt -o hvn:a -n "vdu" -- "$1"`
eval set -- "$TEMP"
while true ; do
case "$1" in
-h|--argh) ARG_H=1 ; shift ;;
-v|--argv) ARG_V=1 ; shift ;;
-n|--argn)
case "$2" in
"") shift 2 ;;
*) ARG_N=$2 ; shift 2 ;;
esac ;;
-a|--arga) ARG_A=1 ; shift ;;
--) shift ; break ;;
*) echo "error" ; exit 1 ;;
esac
done
echo "$ARG_H"
echo "$ARG_V"
echo "$ARG_N"
echo "$ARG_A"
./vdu -a-v-n15
或
但是如果我输入
./vdu -a -v -n 15
它将只注册第一个标志。为什么会这样?这段代码似乎与我一直在看的getopts教程完全相同
TEMP=`getopt -o hvn:a -n "vdu" -- "$1"`
$1
只是程序的第一个参数。使用$@
传递所有参数
TEMP=`getopt -o hvn:a -n "vdu" -- "$@"`
其他想法:
- 传统做法是将
传递给$0
,而不是硬编码程序名-n
- 如果将
与eval set
调用结合使用,则可以跳过临时变量getopt
- 使用
代替$(…)
被认为是一种很好的风格<代码>$(…)可以更容易地嵌套```
eval set -- "$(getopt -o hvn:a -n "$0" -- "$@")"
$1
只是程序的第一个参数。使用$@
传递所有参数
TEMP=`getopt -o hvn:a -n "vdu" -- "$@"`
其他想法:
- 传统做法是将
传递给$0
,而不是硬编码程序名-n
- 如果将
与eval set
调用结合使用,则可以跳过临时变量getopt
- 使用
代替$(…)
被认为是一种很好的风格<代码>$(…)可以更容易地嵌套```
eval set -- "$(getopt -o hvn:a -n "$0" -- "$@")"
啊,非常感谢。我认为,由于我是在函数中执行此操作,因此必须将$@作为参数传入,并使用$!在getopt命令中,显然不是这样。啊,非常感谢。我认为,由于我是在函数中执行此操作,因此必须将$@作为参数传入,并使用$!在getopt命令中,显然不是这样。