Sou iniciante em scripts Bash e meu script não está se comportando corretamente. Não sei como consertar ou a maneira correta de codificá-lo. O usuário deve poder inserir apenas um argumento. ( $ nowOn f132a99
) Se você inserir mais de um argumento, será exibido o aviso Please enter a single, valid user id: "
Não tenho certeza de como consertar isso.
$ nowOn f132a99 = Saída correta
$ nowOn f132a99 f132a98 = Erro esperado do operador binário da linha 1
$ nowOn f132a99 f132a98 f132a97 = Erro na linha 1 Muitos argumentos
if [ -z "$@" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$@"
fi
#user validation check
if ! grep -q "$userid" /etc/passwd >/dev/null 2>&1;then
echo
echo "The user you entered, $userid is not a valid user on this system."
exit 2
else
#login check
if ! who | grep "$userid" >/dev/null 2>&1;then
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is NOT currently logged on
exit 1
else
#login check
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is currently logged on.
exit 0
fi
fi
Eu também tentei o código a seguir abaixo, mas se você inserir mais de um argumento ( nowOn f132a99 f132a97
), ele apenas exibirá os resultados para f132a99 e desconsiderará o resto, e não ecoaráPlease enter a single, valid user id:
if [ -z "$1" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi
Responder1
Sim, seu teste [ -z "$@" ]
não funciona como você espera. O "$@"
irá se expandir para cada argumento de linha de comando individual, citado, o que fornece um teste que se parece essencialmente [ -z "f132a99" "f132a98" "f132a97" ]
com três argumentos.
O que você deve fazer, se quiser que o usuário forneça apenas um único argumento, é exatamente o que você mencionouem sua própria resposta, ou seja, use um teste como [ "$#" -ne 1 ]
para testar entradas inválidas.
No entanto, existe outra opção, que é considerartodosdos argumentos fornecidos como IDs de usuário e faça um loop sobre eles:
if [ "$#" -eq 0 ]; then
echo 'No user ID given' >&2
exit 1
fi
for userid do
# code to process "$userid" goes here
done
Outras notas sobre o seu código:
O teste para IDs de usuário válidos é falho. Considere um sistema onde não há nenhum usuário chamado bill
, mas onde háéa billy
. Inserir bill
como ID do usuário não detectaria isso como um ID de usuário inválido grep -q "$userid" /etc/passwd
(este comando possivelmente também geraria um erro se a $userid
string começasse com um travessão).
Seria melhor testar com getent -- passwd "$userid"
e executar todas as operações relacionadas à obtenção de dados do passwd
banco de dados por meio de getent passwd
.
Você tem um problema semelhante com who | grep "$userid"
, que é melhor escrito como who | grep -q "^$userid\>"
.
Eu mencionei essas coisasna minha resposta à sua pergunta anterior.
Responder2
Resolvi usando:
if [ $# -ne 1 ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi