使用bash中CASE语句中的命令参数 [英] Consume command args in a case statement in bash

查看:28
本文介绍了使用bash中CASE语句中的命令参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个CASE语句,它包含我的命令的一部分,我希望它遍历所有参数,直到它们都被使用完。

while [ ! -z ${@:2} ] ; do
    case "${@:2}" in
        -d|--delete*)
            YES_DELETE=1
            shift
            ;;        
        -nd|--nodelete*)
            NO_DELETE=1
            shift
            ;;
        -y|--yes*)
            SKIP_PROMPT=1
            shift
            ;;
        -*|*)
            echo "Bad command, try again."
            ;;
    esac
done

我的命令$@$ mpip stt=12 -nd -y,这使得${@:2}="-nd -y"。 如果它也像我希望的那样工作,那么它将在迭代两次之后退出While循环,NO_DELETE=1 SKIP_PROMPT=1将为true。当我运行它时,一切仍未初始化,它变成一个无限循环,我不知道我做错了什么。

推荐答案

不要尝试绕过位置参数,而是将它们弹出。这将使您的逻辑更加简单,并且您的命令行界面更加用户友好(因为在这种情况下,位置参数可以跟在选项后面,这实际上是用于命令行解析的POSIX标准公式--实际上,POSIX工具根本不需要允许选项跟在位置参数后面,尽管GNU工具通常这样做作为扩展)。

#!/bin/bash
#      ^^^^- IMPORTANT: Not /bin/sh

args=( ) # positional arguments

# completely empty the argv, shifting positional options into "${args[@]}" and processing
# option flags.
while (( $# )); do
  case $1 in
    -d)   yes_delete=1 ;;
    -nd)  no_delete=1 ;;
    -y)   skip_prompt=1 ;;
    -*)   echo "Bad option" >&2; exit 1 ;;
    --)   shift; args+=( "$@" ); set -- ;;
    *)    args+=( "$1" ) ;;
  esac
  shift
done

# with options popped off, make our positional arguments the whole argument list
set -- "${args[@]}"

# examples of positional argument validation
(( "$#" )) || { echo "Error: At least one argument is required" >&2; exit 1; }
[[ $1 != *=* ]] || { echo "Error: First argument must contain an = sign" >&2; exit 1; }

这篇关于使用bash中CASE语句中的命令参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆