1

我正在尝试以一种易于添加未来命令行参数的方式编写脚本。我正在使用 getopts 并且效果很好。但是,我遇到了 case 语句的问题。

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 它是空的。有任何想法吗?有一个更好的方法吗?

4

1 回答 1

2

一些发现:

  • [您需要在每个和周围留出空格](第 2 行)。见help [
  • 您不需要(大小写匹配。见help case
  • 您可以使用VAR1="$2"andshift 2而不是两个单独的班次。见help shift
  • 你想把--箱子放在前面*,然后把箱子移到break箱子里*
  • 向后遵循逻辑:如果is not也LAST_VAR将设置。在此之前你if is not也没有。所以永远无法设置。$1-o-texit$1-o-tLAST_VAR

我建议查看一些getopt示例以获取一些想法。一些测试代码的无耻插件:

# 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
于 2013-05-23T13:46:06.667 回答