Adicione “not” à instrução if no shell script

4

Eu tenho o seguinte script que deve existir se o usuário não existir.

#check if user currently exists on system
if id $User > /dev/null 2>&1
then
    #user exists no need to exit program
    echo "blah blah, what a waste of space"
else
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

Meu problema é que eu idealmente gostaria de colocar um "não" se a primeira declaração if para que eu possa reduzir minha declaração if, else. Idealmente eu gostaria de algo assim:

if !(id $User > /dev/null 2>&1)
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi
    
por John Crawford 14.09.2013 / 00:18

3 respostas

5

"Não" é escrito ! , sem pontuação e um espaço depois.

if ! id "$user_name" > /dev/null 2>&1
then
    echo 1>&2 "This user does NOT exists.  Please create that user before using this script.\n"
    exit 1
fi

Sua proposta funcionaria, mas os parênteses criam uma subshell para executar o comando id , que é supérfluo.

Outras alterações:

  • Sempre coloque aspas duplas em torno das substituições de variáveis: "$user_name"
  • Já existe uma variável USER , que é o nome do usuário logado atual. Os nomes das variáveis são sensíveis a maiúsculas e minúsculas, mas os humanos não tanto.
  • Retorna um valor entre 1 e 125 para indicar falha em um programa.
  • Relatar erros ao erro padrão (descritor de arquivo 2), não à saída padrão.
por Gilles 14.09.2013 / 00:26
0

Existe um operador not no shell script, e é ! , mas você não está usando corretamente.

Coloque um espaço entre o operador ! e seu operando e deixe de fora os parênteses. Isso deve funcionar para todos os shells no estilo POSIX , incluindo bash e sh / dash .

if ! id $User > /dev/null 2>&1
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

Você pode usar parênteses para agrupar se quiser, embora não seja necessário neste caso. Um novo subshell é criado para executar a expressão entre parênteses. O operador ! ainda deve ter um espaço entre ele e o caractere ( . (Espaços ao redor dos parênteses são opcionais).

if ! (id $User > /dev/null 2>&1)
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

Veja a excelente resposta de Gilles , para algumas boas alternativas e recomendações de estilo. (Também, obrigado a Gilles por algumas correções sobre o uso de parênteses.)

    
por Eliah Kagan 14.09.2013 / 00:29
0

Perguntas como esta são respondidas em "Guia Avançado de Roteiro de Bash"
 - que pode ser visualizado e disponibilizado para download no link

    
por Hannu 08.06.2014 / 22:47

Tags