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
bash
if-statement
syntax
boolean-expression
Sandra Schlichting
fuente
fuente

!No debería estar dentro de los corchetes? es decir[ ! EXPR ]Respuestas:
tratar
grepregresatruesi encuentra el objetivo de búsqueda yfalsesi no lo hace.Entonces NO
false==true.ifLa 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-copción (contar) para grep y luego hacer loif ! [ $(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
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é quegreppuede 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/passwdserí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:
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>&2al final de suechopara imprimirstderr?!: not found'grepesta manera.-qsuprime 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 porquesysase imprimirá, lo que hace que la declaración de prueba se haga realidad. Sin embargo,if ! [ $(true) ]; then echo false; fisiempre se imprimiríafalseporque eltruecomando 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/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 diceEsto provocaría una coincidencia válida en cosas como
carayenocetc., a pesar de que no hay usuarios en mi sistema.Para que una
grepsolución sea correcta, deberá analizar el/etc/passwdarchivo correctamente :... o cualquier otra prueba similar contra el primero de los
:campos delimitados.fuente
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í:... 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 statuselpingcomando)También para su información, tenga en cuenta que dado que los
crontrabajos se ejecutan ya querootno hay necesidad de usarlossudo pingen uncronscript.fuente