Me gustaría echo
ejecutar el comando cuando cat /etc/passwd | grep "sysa"
no sea cierto.
¿Qué estoy haciendo mal?
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
fuente
fuente
!
No debería estar dentro de los corchetes? es decir[ ! EXPR ]
Respuestas:
tratar
grep
regresatrue
si encuentra el objetivo de búsqueda yfalse
si no lo hace.Entonces NO
false
==true
.if
La evaluación en shells está diseñada para ser muy flexible, y muchas veces no requiere cadenas de comandos (como ha escrito).Además, al mirar su código tal como está,
$( ... )
se debe recomendar el uso de la forma de sustitución de cmd, pero piense en lo que está saliendo del proceso. Intentaecho $(cat /etc/passwd | grep "sysa")
ver a qué me refiero. Puede llevarlo más allá utilizando la-c
opción (contar) para grep y luego hacer loif ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
que funciona, pero es bastante antiguo.PERO, podría usar las funciones de shell más recientes (evaluación aritmética) como
lo que también le brinda el beneficio de usar los operadores de comparación basados en c-lang,
==,<,>,>=,<=,%
y tal vez algunos otros.En este caso, según un comentario de Orwellophile, la evaluación aritmética se puede reducir aún más, como
O
Finalmente, hay un premio llamado
Useless Use of Cat (UUOC)
. :-) ¡Algunas personas saltan arriba y abajo y lloran gothca! Solo diré quegrep
puede tomar un nombre de archivo en su línea cmd, entonces, ¿por qué invocar procesos adicionales y construcciones de tuberías cuando no es necesario? ;-)Espero que esto ayude.
fuente
grep "^$user:" /etc/passwd
sería la forma más correcta de buscar / etc / passwd incidentalmente,grep -v
donde -v invierte la búsqueda si lo desea para evitar el desorden de ||(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
Creo que se puede simplificar en:
o en una sola línea de comando
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
fuente
1>&2
al final de suecho
para imprimirstderr
?!: not found
'grep
esta manera.-q
suprime la salida.$(...)
contiene el valor , no el estado de salida, es por eso que este enfoque es incorrecto. Sin embargo, en este caso específico, sí funciona porquesysa
se imprimirá, lo que hace que la declaración de prueba se haga realidad. Sin embargo,if ! [ $(true) ]; then echo false; fi
siempre se imprimiríafalse
porque eltrue
comando no escribe nada en stdout (aunque el código de salida sea 0). Por eso es necesario reformularloif ! grep ...; then
.Una alternativa sería
cat /etc/passwd | grep "sysa" || echo error
. Edit: Como Alex señaló, el gato es inútil aquí :grep "sysa" /etc/passwd || echo error
.Encontraron las otras respuestas bastante confusas, espero que esto ayude a alguien.
fuente
En sistemas Unix que lo soportan (no macOS parece):
Esto tiene la ventaja de que consultará cualquier servicio de directorio que pueda estar en uso (YP / NIS o LDAP, etc.) y el archivo de base de datos de contraseñas local.
El problema con
grep -q "$username" /etc/passwd
es que dará un falso positivo cuando no exista ese usuario, pero algo más coincide con el patrón. Esto podría suceder si hay una coincidencia parcial o exacta en otro lugar del archivo.Por ejemplo, en mi
passwd
archivo, hay una línea que diceEsto provocaría una coincidencia válida en cosas como
cara
yenoc
etc., a pesar de que no hay usuarios en mi sistema.Para que una
grep
solución sea correcta, deberá analizar el/etc/passwd
archivo correctamente :... o cualquier otra prueba similar contra el primero de los
:
campos delimitados.fuente
bash
en ese caso.Aquí hay una respuesta a modo de ejemplo:
Para asegurarse de que los registradores de datos estén en línea, se
cron
ejecuta un script cada 15 minutos que se ve así:... y así sucesivamente para cada registrador de datos que puede ver en el montaje en http://www.SDsolarBlog.com/montage
Para su información, el uso
&>/dev/null
redirige todos los resultados del comando, incluidos los errores, a/dev/null
(El condicional solo requiere
exit status
elping
comando)También para su información, tenga en cuenta que dado que los
cron
trabajos se ejecutan ya queroot
no hay necesidad de usarlossudo ping
en uncron
script.fuente