Tendo problemas para permitir apenas um argumento

Tendo problemas para permitir apenas um argumento

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 billcomo 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 $useridstring 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 passwdbanco 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

informação relacionada