Tengo un if
script en mi bash que tiene que verificar si CUALQUIERA de los 2 archivos existe, si no existen debería hacer eco.
Código que tengo:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
Pero esto no parece funcionar por alguna razón.
Estoy 110% seguro de que estos 2 archivos no existen. No recibo ningún error, simplemente no entra en el if
.
Soy nuevo en bash scripting, así que no estoy seguro de qué podría estar mal.
bash
shell-script
Peppercat101
fuente
fuente
[[ ! -f /etc/.../... ]]; echo $?
por cada uno.[[ -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 existe, o si no puede 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 existe o no puede decir 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, como regla, este tipo de prueba conduce a condiciones de carrera. Tal vez hay otra forma.Respuestas:
Si quieres cualquiera, entonces quieres
OR
, noAND
.match
si ambos no existen.Pero dijiste:
Entonces su afirmación se contradice a sí misma. Al menos uno de esos archivos debe existir, si está ejecutando ese código.
Si desea ver cómo
if
se evalúa su declaración, ejecútela con-x
.Entonces verás la ejecución.
fuente
¿No debería ser así? A es un archivo o B es un archivo, luego blabla.
fuente
Esto también puede funcionar para lo que está tratando de hacer. Los corchetes individuales 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 "OR" y "!" niega la condición.
fuente
[
enbash
. Aparte de eso, no veo cómo esto responde la pregunta.[ ! -f ${var} -a ! -f {var}.class ] && echo "match"
debería ser. La búsqueda era: si ellos (ambos) no existen, deberíaecho match
.Su código satisface sus requisitos: se imprimirá
match
siempre que no pueda encontrar ninguno de los archivos.Por lo tanto, la razón
match
no se está imprimiendo está en otra parte. Debe confirmar que se está alcanzando el bloque de código, lo que puede hacer rodeándolo con un par de mensajes de depuración. Por ejemplo, así: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í hay un ejemplo que muestra cómo podría escribir en stdout :
fuente