我正在编写一个脚本来执行一些验证。我尝试制作多个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
答案 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
上,因为它更通用,更便携,可用于打印"事物"同时。它具有格式字符串,并且回显选项因平台而异。