Sou iniciante em Linux/Unix. Aqui está minha tarefa, é muito longo para postar tudo aqui:https://i.stack.imgur.com/v2AJR.jpg
Aqui está a lógica que eu tenho:
Este código irá verificar se o usuário inseriu um argumento ou não. Não sei o que colocar em outro lugar. Nunca falamos sobre a instrução which que aprendi com outro usuário aqui, portanto não se espera que seja usada. Apenas comandos básicos, esta não é uma tarefa superavançada.
if [ $# -ne 1 ]; then
echo Please enter a single, valid user id:
read userid
else
userid=$1
**what goes here?**
fi
Para exibir o nome completo de um usuário (ou seja, Ben Franklin), este é o código que escrevi e testei:
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
Determine se o usuário está logado ou não:
Se o usuário não estiver logado (retornará o código de saída 1):who | grep $userid
- Em seguida, exiba
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
ANDecho is NOT currently logged on
em seguida, termine o script com um código 1.
Se o usuário estiver logado (retornará o código de saída 0):who | grep $userid
- Em seguida, exiba
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
ANDecho is currently logged on
em seguida, termine o script com um código 0.
Determinando se um usuário é válido:
Se o usuário for inválido (retornará o código de saída 1):grep $userid /etc/passwd
- Então ele deve exibir
echo "The user you entered, $userid is not a valid user on this system."
Se o usuário for válido (retornará o código de saída 0):grep $userid /etc/passwd
Como escrevo esse script? Qual é a estrutura completa? Estou preso na estrutura/configuração.
Responder1
Como isso parece uma tarefa, darei apenas as ferramentas e algumas dicas:
Se nenhum argumento foi fornecido ao script, então
$1
(o primeiro argumento do script) estará vazio. Você pode testar isso com[[ -z $1 ]]
. Se você quiser exibir um erro paramuitosargumentos, teste o número de argumentos com[[ $# -eq 1 ]]
(será verdadeiro para um único argumento).O
gentent passwd "$username"
comando pode ser usado para obter apasswd
entrada do usuário$username
. O comando falhará com um status de saída diferente de zero se o usuário não existir. Isso significa que você pode usarif ! getent passwd "$username" >/dev/null; then ...; fi
para reagir a um usuário inexistente$username
.O 5º campo da
passwd
entrada para um usuáriogeralmentecontém o nome completo do usuário (não há realmente nenhuma garantia de que estará no formato "nome, sobrenome"). A entrada pode ter vírgulas extras no final que você deve excluir. Você pode analisar a saída degetent passwd "$username"
usingcut -d: -f 5
para chegar ao quinto campo e, em seguida, excluir da primeira vírgula comname=${name%%,*}
.Em alguns sistemas, o nome completo do usuário pode conter um
&
caractere. Nesses sistemas, esse&
caractere deve ser substituído pelo nome de usuário (para que o nomeSystem &
do usuáriooperator
se torneSystem operator
). Não tenho certeza se o Linux geralmente faz isso, mas isso poderia ser feito com oname=${name/&/$username}
.O
who
utilitário exibe uma lista de usuários que estão conectados no momento. Para combinar$username
com isso, usegrep -e "^$username\>"
. O\>
corresponde ao final de uma palavra para que, por exemplo,antony
não seja correspondido ao procurar ouanton
.grep -q
é útil em umaif
declaração.
Isso segue a estrutura do código:
- Verifique e trate argumentos inválidos (faltando: leia; muitos: saia ou apenas use primeiro). Uma
if
declaração. - Verifique e lide com nome de usuário inválido. Uma
if
declaração. - Obtenha o nome completo do usuário. Atribuição(ões) de variáveis com substituição de comandos.
- Verifique se o usuário está logado (e saída). Uma
if
declaração, possivelmente com umaelse
ramificação.
Não vejo um loop neste script, então haverá uma série de if
instruções e atribuições de variáveis.