簡體   English   中英

在bash中的case語句中使用命令args

[英]Consume command args in a case statement in bash

我有一個case語句是我命令的一部分,我希望它通過所有的arg直到它們被消耗為止。

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; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM