从命令行参数将变量设置为last arg

时间:2013-05-23 13:35:40

标签: linux bash shell unix

我正在尝试以一种简单的方式编写脚本,以便添加将来的命令行参数。我正在使用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。有任何想法吗?有更好的方法吗?

1 个答案:

答案 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