如何优化以下验证?

时间:2016-06-16 14:23:29

标签: bash

我正在编写一个脚本来执行一些验证。我尝试制作多个ifs以验证是否正确存储了每个参数。 我想知道这是否是一个好的方法,或者是否有另一种策略来实现这一目标。这个实现的另一个问题是,当用户没有输入所有参数时,我的脚本只打印第一个,如果是这样的话:

Missing supplierCode

我的完整代码如下所示。我想感谢任何想法或建议,以便更好地实施。

#!/bin/bash
function menu () {
        while (($# >= 1))
        do
        key="$1"
        case $key in
                --supplierCode)
                supplier_code=$2
                shift
                ;;
                --vanID)
                van_id=$2
                shift
                ;;
                --vanIDp)
                van_idp=$2
                shift
                ;;
                --tgoID)
                tgo_id=$2
                shift
                ;;
                --tgoIDp)
                tgo_idp=$2
                shift
                ;;
                --company_name)
                company_name=$2

                shift
                ;;
                --ediFact)
                file_type=E
                ;;
                --webEdi)
                file_type=P
                ;;
                --PV)
                pv=1
                ;;
                --PT)
                pt=1
                ;;
                --help)

                exit
                ;;
        esac
        shift
        done
}
function error () {
        #Validations:
    if [ -z "$supplier_code" ]
        then
                echo "Missing supplierCode"
                exit 1
        fi

    if [ -z "$van_id" ]
        then
                echo "Missing vanID"
                exit 1
        fi
    if [ -z "$van_idp" ]
        then
                echo "Missing vanIDp"
                exit 1
        fi
    if [ -z "$tgo_id" ]
        then
                echo "Missing tgoID"
                exit 1
        fi
    if [ -z "$tgo_idp" ]
        then
                echo "Missing tgoIDp"
                exit 1
        fi
    if [ -z "$company_name" ]
        then
                echo "Missing company_name"
                exit 1
        fi
    if [ -z "$file_type" ]
        then
                echo "Missing ediFact or webEdi"
                exit 1
        fi
     if [ "$pv" -eq "0" ] && [ "$pt" -eq "0" ]
        then
                echo "Error: You have to use at least one of those flags --PV , --PT "
                exit 1
    fi

}
menu "$@"
error

1 个答案:

答案 0 :(得分:4)

试试这个:

#!/bin/bash
function menu () {
        while (($# >= 1))
        do
        key="$1"
        case $key in
                --supplierCode)
                supplier_code=$2
                shift
                ;;
                --vanID)
                van_id=$2
                shift
                ;;
                --vanIDp)
                van_idp=$2
                shift
                ;;
                --tgoID)
                tgo_id=$2
                shift
                ;;
                --tgoIDp)
                tgo_idp=$2
                shift
                ;;
                --company_name)
                company_name=$2
                shift
                ;;
                --ediFact)
                file_type=E
                ;;
                --webEdi)
                file_type=P
                ;;
                --PV)
                pv=1
                ;;
                --PT)
                pt=1
                ;;
                --help)

                exit
                ;;
        esac
        shift
        done
}
function error () {
        #Validations:
    is_valid=1
    if [ -z "$supplier_code" ]
        then
                echo "Missing supplierCode"
                is_valid=0
        fi

    if [ -z "$van_id" ]
        then
                echo "Missing vanID"
                is_valid=0
        fi
    if [ -z "$van_idp" ]
        then
                echo "Missing vanIDp"
                is_valid=0
        fi
    if [ -z "$tgo_id" ]
        then
                echo "Missing tgoID"
                is_valid=0
        fi
    if [ -z "$tgo_idp" ]
        then
                echo "Missing tgoIDp"
                is_valid=0
        fi
    if [ -z "$company_name" ]
        then
                echo "Missing company_name"
                is_valid=0
        fi
    if [ -z "$file_type" ]
        then
                echo "Missing ediFact or webEdi"
                is_valid=0
        fi
     if [ "$pv" -eq "0" ] && [ "$pt" -eq "0" ]
        then
                echo "Error: You have to use at least one of the flags --PV , --PT "
                is_valid=0
        fi
    if [ "$is_valid" -eq 1 ]
        then 
                printf "Here you could finally exit with code 2 (for user error), which we do.\n"
                exit 2
        fi

}
menu "$@"
error

不是我最好的编辑,但它应该做你在问题中指出的,即不是在第一个错误的早期退出,而是遍历所有测试然后退出(这里的约定返回2作为使用错误代码)。

PS:我的手指也常常输入echo,但我的大多数情况下我的心态都落在printf上,因为它更通用,更便携,可用于打印"事物"同时。它具有格式字符串,并且回显选项因平台而异。