Esse script não funciona .
Você tem um erro de sintaxe na primeira linha em que uma atribuição a IGNORE_USER
não deve excluir a referência da variável com $
.
Há outro erro de sintaxe na instrução if
. Use [ "string1" = "string2" ]
para comparar strings.
Seu código depende do uso de $IGNORE_USER
sem aspas. Isso divide a string em espaços em branco, que é o que você deseja fazer. No caso mais geral, isso não é o que você quer fazer, já que os itens na lista podem conter caracteres em branco que devem ser preservados. O shell também executaria a geração de nome de arquivo (globbing) nos valores da string, se usado sem aspas.
Seria melhor usar uma matriz para isso, pois você está lidando com itens separados (nomes de usuário). Sempre que você quiser tratar itens separados como itens separados , não os coloque dentro de uma única string. Fazer isso potencialmente dificultaria a distinção de um item do outro.
Sugestão:
ignore=( 'user1' 'user2' 'user3' )
for u in "${ignore[@]}"; do
if [ "$USER" = "$u" ]; then
exit_program 'bye bye'
fi
done
Isso pressupõe que exit_program
cuida de sair do programa. Caso contrário, adicione exit
após chamar exit_program
. Não há necessidade de testar se a matriz ignore
está vazia, pois o loop não executaria uma única iteração, se fosse.
No código acima, "${ignore[@]}"
(observe as aspas duplas) se expandiria para a lista de nomes de usuários, cada nome de usuário citado individualmente e protegido contra a divisão de palavras e a geração de nome de arquivo.
Relacionados:
Para uma versão que não é específica de bash
, mas que seria executada em qualquer shell parecido com POSIX:
set -- 'user1' 'user2' 'user3'
for u do
if [ "$USER" = "$u" ]; then
exit_program 'bye bye'
fi
done
Isso usa a lista de parâmetros posicionais como a lista de nomes de usuário para ignorar em vez de uma matriz.