首页 > 解决方案 > 如何在 Bash 中验证逗号分隔的选项参数?

问题描述

如何验证参数列表的可能组合?

我的脚本看起来像这样,它验证用户是否传递了苹果、香蕉或芒果以外的参数:

validate() {
    if [[ "$2" != "apple" ]] && [[ "$2" != "mango" ]] && [[ "$2" != "banana" ]]; then
        echo  "--fruits should always be \"apple\", \"mango\", \"banana\""
    fi
    
}

args_() {
    if [[ $# -eq 0 ]]; then
        echo "please enter valid parameter"
    fi

    for ARGUMENT in "$@"; do
        KEY=$(echo $ARGUMENT | cut -f1 -d=)
        VALUE=$(echo $ARGUMENT | cut -f2 -d=)

        case "$KEY" in
        --fruits)
            validate ${KEY} ${VALUE}
            ;;
        *) ;;
        esac

    done
}

args_ $*

但是如果用户也组合传递参数,我想通过验证。例如

bash validate.sh --fuits=apple,mango

或者

bash validate.sh --fruits=apple,banana,mango

有没有办法验证 bash 中可能的参数列表?

标签: bash

解决方案


您可以将 ',' 转换为 ' ' 以将您的论点作为一个数组并在其中创建一个 for 循环:

for FRUIT in $(echo $VALUE | tr ',' ' '); do
    validate ${KEY} ${FRUIT}
done

在您的代码中:

args_() {
        ...
        case "$KEY" in
        --fruits)
            for FRUIT in $(echo $VALUE | tr "," " "); do
                validate ${KEY} ${FRUIT}
            done
            ;;  
        *) ;;
        esac
        ...

测试:

$ bash main.sh --fruits=apple                        # Accepted
$ bash main.sh --fruits=apple,mangodd                # Not Accepted - Typo
--fruits should always be "apple", "mango", "banana"
$ bash main.sh --fruits=apple,banana                 # Accepted

这也是我的代码版本:

#!/usr/bin/env bash

# List of your fruits
FRUIT_LIST=(apple banana mango)

# Validate Function
validate() {
    ACCEPTED_MSG="$2 is Accepted."
    NOT_ACCEPTED_MSG="$2 is wrong, check $ $0 --help"
    (for e in "${FRUIT_LIST[@]}"; do [[ "$e" == "$2" ]] && exit 0; done) && echo $ACCEPTED_MSG || echo $NOT_ACCEPTED_MSG
}

# Return Help
usage() {
    cat <<EOF
usage: $0 [OPTIONS]

Options:
    --fruits=[fruit]        Validate your fruit(s)    

Example:
    $0 --fruits=banana,mango
EOF
}

# Main Functionality
main() {
    [ $# -eq 0 ] && echo "please enter valid parameter"

    for ARGUMENT in "$@"; do
        KEY=$(echo $ARGUMENT | cut -f1 -d=)
        VALUE=$(echo $ARGUMENT | cut -f2 -d=)
        case "$KEY" in
        --fruits)
            for FRUIT in $(echo $VALUE | tr "," " "); do
                validate ${KEY} ${FRUIT}
            done
        ;;
        *)
            usage
        ;;
        esac

    done
}

# Run Main
main $*

推荐阅读