簡體   English   中英

如何阻止getopts將空白或null或其他選項作為選項值

[英]How to stop getopts from taking blank or null or other options as option value

我(大概是每個人)不時地遇到這個問題,但我自己找不到任何好的解決方法。 getopts查找一個參數時,它實際上是下一個參數,即使它是一個選項。 這就是我做的停止(代碼片段):

#!/bin/bash 

function optsGet()
{
    while getopts ":c:f" opt; do
        case $opt in
            c ) [[ -z "${OPTARG}" || "${OPTARG}" == -* ]] \
                && { echo -e "ERROR: Invalid argument\n"; exit 1; }
                CNAME="${OPTARG}.tEsTsTr"
                ;;
            f ) FORCE=true
                ;;
            \?) echo -e "Invalid option: -$OPTARG\n" >&2;;
            : ) echo -e "Missing argument for -$OPTARG\n" >&2; exit 1;;
            * ) echo -e "Unimplemented option: -$OPTARG\n" >&2; exit 1;;
        esac
    done

    shift $(($OPTIND - 1))
}

optsGet "${@}"
echo -e "CNAME: ${CNAME}\n"

但它仍然將空白/ null作為有效參數。 所以,這有效:

san@AM0150 testtools$ ./getopts.sh -c -f
ERROR: Invalid argument

但這些不是:

san@AM0150 testtools$ ./getopts.sh -c " " -f
CNAME:  .tEsTsTr

san@AM0150 testtools$ ./getopts.sh -c \  -f
CNAME:  .tEsTsTr

我非常期待Missing argument for -c錯誤的Missing argument for -c 這里有什么我想念的嗎? 或者有人知道解決方法嗎? 任何意見都將非常感激。 干杯!!


更新(主要基於devnull的回復):

只是為了完整性,現在我有這個小功能:

 function ifEmpty() { local VAL=$1 local OPT=$2 [[ -z "${VAL}" || "${VAL}" =~ ^[[:space:]]*$ || "${VAL}" == -* ]] \\ && { echo -e "\\n ERROR: Missing argument for option: -${OPT}\\n" >&2; exit 1; } } 

然后這可以這樣使用:

 c ) ifEmpty "${OPTARG}" "${opt}" CNAME=${OPTARG//[[:space:]]} ;; 

對於需要參數的所有選項。 干杯!!

PS。 由於某種原因, *[[:space:]]*在函數中使用時不起作用。

對於空字符串, -z將返回true,而不是包含空格的字符串。

檢查字符串是否僅包含空格。 說:

    c ) [[ -z "${OPTARG}" || "${OPTARG}" =~ ^[[:space:]]*$ || "${OPTARG}" == -* ]] \

代替

    c ) [[ -z "${OPTARG}" || "${OPTARG}" == -* ]] \

這也會處理null( \\ )的情況。

EDIT:事實上,它也可以寫成:

    c ) [[ -z "${OPTARG}" || "${OPTARG}" == *[[:space:]]* || "${OPTARG}" == -* ]] \

這可能是一個非答案的答案,但我不會試圖阻止它。 如果-c采用文件名作為參數,比方說, -f可以是有效的文件名,也可以   (空間)。 作為一般規則,我不認為shell腳本應該做“有用”的事情,比如修剪空格或拋出異常但技術上有效的參數。

暫無
暫無

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

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