【问题标题】:Setting variable to last arg from command line parameters从命令行参数将变量设置为最后一个 arg
【发布时间】:2013-05-18 21:33:51
【问题描述】:

我正在尝试以一种易于添加未来命令行参数的方式编写脚本。我正在使用 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 它是空的。有任何想法吗?有没有更好的方法来做到这一点?

【问题讨论】:

  • @l0b0 谢谢!我的实际代码在那里有空格,我不知道我可以排除 ( 以防万一匹配。

标签: linux bash shell unix


【解决方案1】:

一些发现:

  • 每个[ 和] (第2 行)都需要空格。见help [。
  • 在大小写匹配中不需要(。见help case。
  • 您可以使用VAR1="$2" 和shift 2 而不是两个单独的班次。见help shift。
  • 您想将-- 大小写放在* 之前,并将break 移动到* 大小写。
  • 向后遵循逻辑:如果$1 既不是-o 也不是-t,则将设置LAST_VAR。在此之前,如果$1 既不是-o 也不是-t,那么你exit。所以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

【讨论】:

  • 在我有 if 语句的那一行,我是否正确管理了 args 的顺序?如果有 5 个参数,我觉得它可能会变成一个很长的 if 语句......
  • @nkon 你不需要那个if 声明。如果您简单地遍历所有参数并信任 getopt 来检查是否存在应该存在的值,则会简单得多。
  • getopt 参数列表第一行的 -o 是什么?
  • @nkon 请在询问之前至少检查man 页面 - 这是指定命令选项的选项。
  • @nkon 抱歉,您可能使用的是不同的版本。与您的原始代码一样,它应该可以在没有 -o 的情况下工作。
猜你喜欢
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2015-03-29
相关资源
最近更新 更多