Y lógico en un script bash

Tengo un if en mi script bash que tiene que comprobar si ALGUNO de los 2 archivos existen, si no existen, debería coincidir.

Código que tengo:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Pero esto no » No parece funcionar por alguna razón.

Estoy 110% seguro de que estos 2 archivos no existen. No obtengo ningún error, simplemente no ingresa el if.

Soy nuevo en la creación de scripts bash, así que no estoy seguro de qué podría ser

Comentarios

  • No ' creo que ninguna de las respuestas publicadas realmente aborde la pregunta . ¿Qué sucede cuando pruebas las pruebas individualmente? Haz [[ ! -f /etc/.../... ]]; echo $? para cada una.
  • Una advertencia : [[ -f xxx ]] devuelve verdadero si xxx existe y es un archivo normal (o un enlace simbólico a un archivo normal). Devolverá falso si no ' t existe, o si no puede ' t decir si existe o no o si existe pero no es un archivo normal (directorio, tubería, dispositivo, socket …) o si ' es un enlace simbólico a un archivo que no ' t existe o puede ' Para saber si existe o no o no es un archivo normal … [[ -e $file ]] || [[ -L $file ]] está más cerca de una prueba de existencia. ls -d -- "$file" > /dev/null 2>&1 está aún más cerca. Y, por regla general, este tipo de prueba conduce a condiciones de carrera. Quizás haya ' s de otra manera.

Responder

Si quieres o entonces quieres OR, no AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Esto coincidirá si falta uno o ambos archivos.
  • Su código solo imprime match si ambos no existen.

Pero , dijiste:

Estoy 110% seguro de que estos 2 archivos no existen. No obtengo ningún error, simplemente no ingresa el if.

Entonces, su declaración se contradice. Al menos uno de esos archivos debe existir, si estás ejecutando ese código.

Si desea ver cómo se evalúa su if declaración, ejecútela con -x.

#!/bin/bash -x if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Entonces» verás la ejecución.

$ ./test.sh + [[ ! -f /etc/benchmarking/code ]] + [[ ! -f /etc/benchmarking/code.class ]] + echo match match $ 

Comentarios

  • Quiero que se haga eco " coincida con " si ninguno de los archivos existe, si existe uno, no imprime coincidencia. Lo intentaré con -x
  • En ese caso, su código original debería estar bien. Y de hecho funciona para mí.

Respuesta

¿No debería ser así? A es un archivo o B es un archivo, luego blabla.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Respuesta

Esto también puede funcionar para lo que está intentando hacer. Los corchetes simples no se usan comúnmente hoy en día con bash, pero esta sigue siendo una opción. Usar «-o» es efectivamente una operación «O» y «!» niega la condición.

var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match" 

Comentarios

  • Don ' Nunca use [ en bash. Aparte de eso, no veo cómo esto responde a la pregunta.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" debería ser. La misión era: si (ambos) no ' no existen, debería echo match.

Respuesta

Su código satisface sus requisitos: imprimirá match siempre que no pueda encontrar ninguno de los archivos .

Por lo tanto, la razón por la que match no se imprime es en otra parte. Debe confirmar que se está alcanzando el bloque de código, lo que puede hacer rodeándolo con un un par de mensajes de depuración. Por ejemplo, así:

echo "@ About to enter if...fi block" if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi echo "@ Finished if...fi block" 

Mi preferencia habitual es que los mensajes de depuración vayan a stderr para evitar interrumpir el flujo de datos a stdout , pero lo he evitado aquí porque dijiste que eras un principiante. Aquí tienes un ejemplo que muestra cómo puedes escribir en stdout :

echo "@ About to enter if...fi block" >&2 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *