我试图在bash中编写一个脚本,检查用户输入的有效性。
我想将输入(变量x)匹配到一个有效值列表。
我现在想到的是:
for item in $list
do
if [ "$x" == "$item" ]; then
echo "In the list"
exit
fi
done
我的问题是,如果有更简单的方法,
对于大多数编程语言,类似list.contains(x)。
列表是:
list="11 22 33"
我的代码将只对这些值回显消息,因为list被视为数组而不是字符串,
所有的字符串操作都将验证1,而我希望它失败。
之前的答案没有使用tr,我发现它对grep很有用。假设列表中的项以空格分隔,检查精确匹配:
echo $mylist | tr ' ' '\n' | grep -F -x -q "$myitem"
如果条目在列表中,这将返回退出代码0,如果不在列表中,则返回退出代码1。
最好将它作为函数使用:
_contains () { # Check if space-separated list $1 contains line $2
echo "$1" | tr ' ' '\n' | grep -F -x -q "$2"
}
mylist="aa bb cc"
# Positive check
if _contains "${mylist}" "${myitem}"; then
echo "in list"
fi
# Negative check
if ! _contains "${mylist}" "${myitem}"; then
echo "not in list"
fi
我发现使用echo $LIST | xargs -n1 echo | grep $VALUE更容易,如下图所示:
LIST="ITEM1 ITEM2"
VALUE="ITEM1"
if [ -n "`echo $LIST | xargs -n1 echo | grep -e \"^$VALUE`$\" ]; then
...
fi
这适用于空格分隔的列表,但你可以通过执行以下操作将其调整为任何其他分隔符(如:):
LIST="ITEM1:ITEM2"
VALUE="ITEM1"
if [ -n "`echo $LIST | sed 's|:|\\n|g' | grep -e \"^$VALUE`$\"`" ]; then
...
fi
注意,“是测试工作所必需的。
假设TARGET变量只能是“二项式”或“回归”,那么如下所示:
# Check for modeling types known to this script
if [ $( echo "${TARGET}" | egrep -c "^(binomial|regression)$" ) -eq 0 ]; then
echo "This scoring program can only handle 'binomial' and 'regression' methods now." >&2
usage
fi
您可以通过使用|(管道)字符分隔更多字符串到列表中。
使用egrep的优点是可以轻松地添加大小写不敏感(-i),或者使用正则表达式检查更复杂的场景。