我正在尝试以一种简单的方式编写脚本,以便添加将来的命令行参数。我正在使用getopts,效果很好。但是,我遇到了案例陈述的问题。
args=`getopt lLo:t: $*`
if [ $? -ne 0 ]
then
echo "Usage: Default error message"
fi
while [ "$#" -eq 3 ] || [ "$#" -eq 5 ]
do
if [ "$1" != "-o" ] && [ "$1" != "-t" ]
then
echo "\nInvalid argument sequence."
exit 1
fi
case "$1" in
(-o)
shift
VAR1="$1"
shift
;;
(-t)
shift
VAR2="$1"
shift
;;
(*)
LAST_VAR="$1"
;;
(--) shift; break;;
esac
done
如果我然后回显$ LAST_VAR则为null。有任何想法吗?有更好的方法吗?
答案 0 :(得分:2)
一些调查结果:
[
和]
周围都需要空格(第2行)。请参阅help [
。(
。请参阅help case
。VAR1="$2"
和shift 2
代替两个单独的班次。请参阅help shift
。--
案例放在*
之前,并将break
移至*
案例。LAST_VAR
既不是$1
也不是-o
,则会设置-t
。在此之前,exit
$1
既不是-o
也不是-t
。因此永远不能设置LAST_VAR
。我建议查看一些getopt
示例以获取一些想法。一些tested code的无耻插件:
# Process parameters
params="$(getopt -o d:e:fshv \
-l diff:,exclude:,force,skip-existing,help,verbose \
--name "$cmdname" -- "$@")"
if [ $? -ne 0 ]
then
usage
fi
eval set -- "$params"
unset params
while true
do
case $1 in
-d|--diff)
diff_exec=(${2-})
shift 2
;;
-e|--exclude)
# Will override $default_excludes
excludes+=("${2-}")
shift 2
;;
-f|--force)
action='R'
shift
;;
-s|--skip-existing)
action='S'
shift
;;
-h|--help)
usage
exit
;;
-v|--verbose)
verbose='--verbose'
shift
;;
--)
shift
if [ -z "${1:-}" ]
then
error "Missing targets." "$help_info" $EX_USAGE
fi
if [ -z "${2:-}" ]
then
error "Missing directory." "$help_info" $EX_USAGE
fi
targets=(${@:1:$(($#-1))})
source_dir="${@:$#}"
break
;;
*)
usage
;;
esac
done