我试图在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,而我希望它失败。
Matvey是对的,但你应该引用$x,并考虑任何类型的“空格”(例如新行)
[[ $list =~ (^|[[:space:]])"$x"($|[[:space:]]) ]] && echo 'yes' || echo 'no'
所以,即。
# list_include_item "10 11 12" "2"
function list_include_item {
local list="$1"
local item="$2"
if [[ $list =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] ; then
# yes, list include item
result=0
else
result=1
fi
return $result
}
然后结束
`list_include_item "10 11 12" "12"` && echo "yes" || echo "no"
or
if `list_include_item "10 11 12" "1"` ; then
echo "yes"
else
echo "no"
fi
注意,在变量的情况下必须使用"":
`list_include_item "$my_list" "$my_item"` && echo "yes" || echo "no"
如果将列表固定在脚本中,我最喜欢以下几个:
validate() {
grep -F -q -x "$1" <<EOF
item 1
item 2
item 3
EOF
}
然后使用验证“$x”来测试是否允许使用$x。
如果你想要一行代码,并且不关心项目名称中的空格,你可以使用这个(注意-w而不是-x):
validate() { echo "11 22 33" | grep -F -q -w "$1"; }
注:
这是POSIX sh兼容的。
Validate不接受子字符串(如果需要,可以删除grep的-x选项)。
Validate将其参数解释为固定字符串,而不是常规字符串
表达式(如果需要,可以删除grep的-F选项)。
演示函数的示例代码:
for x in "item 1" "item2" "item 3" "3" "*"; do
echo -n "'$x' is "
validate "$x" && echo "valid" || echo "invalid"
done