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
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
[
enbash
. 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íaecho 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
[[ ! -f /etc/.../... ]]; echo $?
para cada una.[[ -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.