Se, elif e outras instruções do script de shell do Linux

1
#!/bin/bash

echo "Type in your username in lowercase letters"
read user
#sudo adduser $user

echo "Are you a student or teacher?"
read group

if (("$group"=="teacher"));
then
        #sudo usermod -aG teachers
        echo "teacher"

elif (("$group"=="student"));
then
        #sudo usermod -aG students
        echo "students"
else
        echo "Sorry this group doesn't exist"
fi

Estou tentando criar um script de shell que permita criar um usuário e adicioná-lo automaticamente a grupo em que eles querem estar. A entrada é um aluno ou um professor embora eu queira incluir essas declarações acima mas eu não consigo fazer isso funcionar porque ele simplesmente vai para a declaração 'if' e ignora se eu usar a entrada student .

Você poderia me ajudar com esse problema?

por Demetris 04.03.2016 / 18:08

3 respostas

0

IMO case é uma correspondência melhor para essa tarefa do que se / elif / else / fi. Por exemplo:

case "$group" in 
    teacher)  echo teacher ; sudo usermod -aG teachers ;;
    student)  echo student ; sudo usermod -aG students ;;
    *) echo "Sorry, this group doesn't exist" ; exit 1 ;;
esac

Observe que curingas podem ser usados:

    te*)  echo teacher ; sudo usermod -aG teachers ;;
    st*)  echo student ; sudo usermod -aG students ;;

que corresponderá a qualquer grupo inserido a partir de te ou st .

BTW, em vez de executar sudo várias vezes no script, é melhor escrever o script para que primeiro receba a entrada do usuário, depois o valide / higienize e só depois execute sudo uma vez para executar as ações necessárias. Se necessário, escreva um segundo script que faça APENAS o material adduser e usermod baseado nos argumentos passados na linha de comando, e permita somente que o script seja executado pelo sudo.

Por exemplo:

#! /bin/sh

read -p "Type in your username in lowercase letters: " user
grep -q "^$user:" /etc/passwd && echo "Sorry, that user already exists" && exit 1

read -p "Are you a student or teacher? " group

[[ "$group" ~ student|teacher ]] || echo "Sorry, no such group" && exit 1

sudo useradd "$user" -G "$group"

mas é difícil ver o ponto desse script quando você pode fazer tudo na linha de comando com sudo useradd user -G group sem perder tempo com prompts e respondendo perguntas.

    
por 05.03.2016 / 01:14
2

tente

if [ "$group" = teacher ] 

mente

  • espaço arround [ e ]
  • = (não precisa de ==)
  • sem ponto e vírgula

em vez de

if (("$group"=="teacher"));
    
por 04.03.2016 / 18:14
1

No bash, isso:

if (("$group"=="teacher"));

é um teste numérico das variáveis. As variáveis são avaliadas como números e, se contiverem apenas texto, elas serão avaliadas como 0 .

O teste correto para o texto no bash é:

if [[ $group == teacher ]];

não há necessidade de cotações neste caso (nem sempre) e você pode usar == ou = (que são equivalentes dentro de [[ ).

Para shells POSIX, você precisa usar:

if [ "$group" = "teacher" ];

Você precisa usar [ simples, citar a variável e usar o = .

    
por 04.03.2016 / 21:19