我的 while 循环检查中有一个错误。我正在检查用户输入是否是有效的用户界面。这是我的代码:
#!/bin/bash
net_array=()
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
net_array+=("$iface")
done
unset "net_array[${#net_array[@]}-1]"
# Network Interface selection
printf "\nPlease select the network interface you want to use:\n"
read -r user_iface
while ! [[ "${net_array[@]}" =~ $user_iface ]]; do # check if the user input is valid
echo "Please enter a valid network interface:"
read -r user_iface
done
通常,此代码有效并检查元素是否在数组中。我的电脑有 eno1、eno2、eno3 接口,当我插入不同的东西(如 eno5)时,它再次要求我插入网络接口。
问题是,如果我仅 insert 1
,它将接受它作为有效的网络接口,但事实并非如此,我想排除它。我想我可以执行不包括所有数字用户输入的额外检查,但我想知道我的错误是什么?
正则表达式匹配
[[ string =~ pattern ]]
实际上并不匹配完整的字符串,而是搜索字符串中的模式(如grep
)。您需要使用特殊字符(“锚点”)将模式锁定到行首^
和行尾。$
所以,你可以做
引用变量,使其内容不被视为正则表达式。
不过,既然您只想找到完全匹配,为什么要使用正则表达式匹配,只需比较是否相等:
除了您的左侧当然不是单个数组项,而是整个数组。在 item an array 中找到具有类似模式匹配的匹配有点棘手,这里讨论了Using case and arrays together in bash(与 相关
case
,但无论如何都是模式匹配)。简而言之,您可以执行以下操作,在两侧搜索带有空格或字符串开头/结尾的所选项目:
只要用户不输入任何空格,它就应该可以工作,尽管我们当然可以更改
IFS
以获取另一个分隔符。但我只会遍历数组元素并检查匹配:
或者将循环放在一个函数中:
然后整个要求输入的事情就像这样
...或者只是使用
select
并保存用户一些输入:(它循环直到你
break
出去)