Gostaria de echo
executar o comando quando isso cat /etc/passwd | grep "sysa"
não for verdadeiro.
O que estou fazendo de errado?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
bash
if-statement
syntax
boolean-expression
Sandra Schlichting
fonte
fonte
!
não deve estar dentro dos colchetes? ie[ ! EXPR ]
Respostas:
experimentar
grep
retornatrue
se encontrar o alvo de pesquisa efalse
se não encontrar.Então NÃO
false
==true
.if
a avaliação em shells é projetada para ser muito flexível e muitas vezes não requer cadeias de comandos (como você escreveu).Além disso, olhando seu código como está, seu uso da
$( ... )
forma de substituição do cmd deve ser recomendado, mas pense no que está saindo do processo. Tenteecho $(cat /etc/passwd | grep "sysa")
ver o que eu quero dizer. Você pode levar isso adiante usando a-c
opção (count) para grep e depois executar oif ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
que funciona, mas é bastante antigo.MAS, você pode usar os recursos mais recentes do shell (avaliação aritmética) como
o que também oferece o benefício de usar os operadores de comparação baseados em c-lang
==,<,>,>=,<=,%
e talvez alguns outros.Nesse caso, por um comentário de Orwellophile, a avaliação aritmética pode ser reduzida ainda mais, como
OU
Finalmente, há um prêmio chamado
Useless Use of Cat (UUOC)
. :-) Algumas pessoas vão pular para cima e para baixo e chorar gothca! Vou apenas dizer quegrep
pode ter um nome de arquivo em sua linha de cmd, então por que invocar processos e construções de tubulação extras quando você não precisa? ;-)Eu espero que isso ajude.
fonte
grep "^$user:" /etc/passwd
seria a maneira mais correta de pesquisar / etc / passwd incidentalmente -grep -v
onde -v inverte a pesquisa, se você quiser para evitar a bagunça de ||(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
Eu acho que pode ser simplificado em:
ou em uma única linha de comando
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
fonte
1>&2
no final da suaecho
impressãostderr
?!: not found
'grep
assim.-q
suprime a saída.$(...)
mantém o valor , não o status de saída, é por isso que esta abordagem está errada. No entanto, nesse caso específico, ele realmente funciona porquesysa
será impresso, o que torna a declaração de teste realidade. No entanto,if ! [ $(true) ]; then echo false; fi
sempre seria impressofalse
porque otrue
comando não grava nada em stdout (mesmo que o código de saída seja 0). É por isso que ele precisa ser reformuladoif ! grep ...; then
.Uma alternativa seria
cat /etc/passwd | grep "sysa" || echo error
. Edit: Como Alex apontou, gato é inútil aqui :grep "sysa" /etc/passwd || echo error
.Achei as outras respostas bastante confusas, espero que isso ajude alguém.
fonte
Nos sistemas Unix que o suportam (não parece o macOS):
Isso tem a vantagem de consultar qualquer serviço de diretório que possa estar em uso (YP / NIS ou LDAP etc.) e o arquivo de banco de dados de senha local.
O problema
grep -q "$username" /etc/passwd
é que ele fornecerá um falso positivo quando esse usuário não existir, mas algo mais corresponderá ao padrão. Isso pode acontecer se houver uma correspondência parcial ou exata em outro lugar do arquivo.Por exemplo, no meu
passwd
arquivo, há uma linha dizendoIsso provocaria uma partida válida em coisas como
cara
eenoc
etc., mesmo que não existem tais usuários em meu sistema.Para que uma
grep
solução esteja correta, você precisará analisar corretamente o/etc/passwd
arquivo:... ou qualquer outro teste semelhante ao primeiro dos
:
campos -delimited.fonte
bash
nesse caso.Aqui está uma resposta a título de exemplo:
Para garantir que os registradores de dados estejam online, um
cron
script é executado a cada 15 minutos, com a seguinte aparência:... e assim por diante para cada registrador de dados que você pode ver na montagem em http://www.SDsolarBlog.com/montage
FYI, o uso de
&>/dev/null
redireciona toda a saída do comando, incluindo erros, para/dev/null
(O condicional requer apenas
exit status
oping
comando)Além disso, para sua informação, observe que, como os
cron
trabalhos são executados,root
não há necessidade de usosudo ping
em umcron
script.fonte