Eu tenho um bug na minha verificação de loop while. Estou verificando se a entrada do usuário é uma interface de usuário válida. Este é o meu código:
#!/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
Geralmente esse código funciona e verifica se o elemento está no array. Meu PC tem interfaces eno1, eno2, eno3 e quando insiro algo diferente como eno5 ele me pede novamente para inserir a interface de rede.
O problema é que se eu inserir apenas 1
, ele aceita como uma interface de rede válida, o que não é o caso e quero excluí-lo. Acho que posso executar uma verificação adicional excluindo todas as entradas numéricas do usuário, mas estou me perguntando qual é o meu erro?
A correspondência regex
[[ string =~ pattern ]]
na verdade não corresponde à string completa, mas procura o padrão na string (comogrep
). Você precisaria bloquear o padrão no início e no final da linha, com os caracteres^
e$
especiais ("âncoras").Então, você poderia fazer
citando a variável para que seu conteúdo não seja considerado um regex.
Porém, como você deseja apenas encontrar correspondências completas, por que usar uma correspondência regex, basta comparar a igualdade:
Exceto que, claro, seu lado esquerdo não era um único item do array, mas o array inteiro. Encontrar um item correspondente em uma matriz com uma correspondência de padrão como essa é um tanto complicado, foi discutido aqui Usando case e arrays juntos no bash (em relação a
case
, mas uma correspondência de padrão de qualquer maneira).Resumindo, você poderia fazer algo assim, procurando pelo item escolhido com um espaço ou início/fim de string em ambos os lados:
Deve funcionar desde que o usuário não insira nenhum espaço em branco, embora possamos, é claro, alterar
IFS
para obter outro separador.Mas eu apenas faria um loop sobre os elementos da matriz e verificaria se havia uma correspondência:
Ou coloque o loop em uma função:
e então toda a coisa de pedir entrada seria algo assim
... ou apenas use
select
e economize digitação dos usuários:(faz um loop até você
break
sair)