Me gustaría echoejecutar 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
Me gustaría echoejecutar 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
Respuestas:
tratar
if ! grep -q sysa /etc/passwd ; then
grepregresa truesi encuentra el objetivo de búsqueda y falsesi 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. Intenta echo $(cat /etc/passwd | grep "sysa")ver a qué me refiero. Puede llevarlo más allá utilizando la -copción (contar) para grep y luego hacer lo if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; thenque funciona, pero es bastante antiguo.
PERO, podría usar las funciones de shell más recientes (evaluación aritmética) como
if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`
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
if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....
O
if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....
Finalmente, hay un premio llamado Useless Use of Cat (UUOC). :-) ¡Algunas personas saltan arriba y abajo y lloran gothca! Solo diré que greppuede 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.
grep "^$user:" /etc/passwd sería la forma más correcta de buscar / etc / passwd incidentalmente, grep -vdonde -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:
grep sysa /etc/passwd || {
echo "ERROR - The user sysa could not be looked up"
exit 2
}
o en una sola línea de comando
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
1>&2al final de su echopara imprimir stderr?
!: not found
'grepesta manera. -qsuprime la salida.
¿Qué estoy haciendo mal?
$(...)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 porque sysase imprimirá, lo que hace que la declaración de prueba se haga realidad. Sin embargo, if ! [ $(true) ]; then echo false; fisiempre se imprimiría falseporque el truecomando no escribe nada en stdout (aunque el código de salida sea 0). Por eso es necesario reformularlo if ! 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.
En sistemas Unix que lo soportan (no macOS parece):
if getent passwd "$username" >/dev/null; then
printf 'User %s exists\n' "$username"
else
printf 'User %s does not exist\n' "$username"
fi
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/passwdes 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 passwdarchivo, hay una línea que dice
build:*:21:21:base and xenocara build:/var/empty:/bin/ksh
Esto provocaría una coincidencia válida en cosas como caray enocetc., a pesar de que no hay usuarios en mi sistema.
Para que una grepsolución sea correcta, deberá analizar el /etc/passwdarchivo correctamente :
if cut -d ':' -f 1 /etc/passwd | grep -qxF "$username"; then
# found
else
# not found
fi
... o cualquier otra prueba similar contra el primero de los :campos delimitados.
bashen ese caso.
Aquí hay una respuesta a modo de ejemplo:
Para asegurarse de que los registradores de datos estén en línea, se cronejecuta un script cada 15 minutos que se ve así:
#!/bin/bash
#
if ! ping -c 1 SOLAR &>/dev/null
then
echo "SUBJECT: SOLAR is not responding to ping" | ssmtp abc@def.com
echo "SOLAR is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "SOLAR is up"
fi
#
if ! ping -c 1 OUTSIDE &>/dev/null
then
echo "SUBJECT: OUTSIDE is not responding to ping" | ssmtp abc@def.com
echo "OUTSIDE is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "OUTSIDE is up"
fi
#
... 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/nullredirige todos los resultados del comando, incluidos los errores, a/dev/null
(El condicional solo requiere exit statusel pingcomando)
También para su información, tenga en cuenta que dado que los crontrabajos se ejecutan ya que rootno hay necesidad de usarlos sudo pingen un cronscript.
!No debería estar dentro de los corchetes? es decir[ ! EXPR ]