script - bash tutorial




¿Cómo puedo saber si un archivo normal no existe en Bash? (12)

He usado el siguiente script para ver si existe un archivo:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

¿Cuál es la sintaxis correcta para usar si solo quiero comprobar si el archivo no existe?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi

Debe tener cuidado al ejecutar la test para una variable sin comillas, ya que podría producir resultados inesperados:

$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1

La recomendación suele ser tener la variable probada entre comillas dobles:

#!/bin/sh
FILE=$1

if [ ! -f "$FILE" ]
then
   echo "File $FILE does not exist."
fi

El comando de test ( [ aquí) tiene un operador lógico "no" que es el signo de exclamación (similar a muchos otros idiomas). Prueba esto:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

Este código también funciona.

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
 echo "File '$FILE' Exists"
else
 echo "The File '$FILE' Does Not Exist"
fi

Este script de shell también funciona para encontrar un archivo en un directorio:

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi


La forma mas sencilla

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"

Para revertir una prueba, use "!". Eso es equivalente al operador "no" lógico en otros idiomas. Prueba esto:

if [ ! -f /tmp/foo.txt ];
then
    echo "File not found!"
fi

O escrito de una manera ligeramente diferente:

if [ ! -f /tmp/foo.txt ]
    then echo "File not found!"
fi

O podrías usar:

if ! [ -f /tmp/foo.txt ]
    then echo "File not found!"
fi

O, presing todos juntos:

if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

Que se puede escribir (usando entonces "y" operador: &&) como:

[ ! -f /tmp/foo.txt ] && echo "File not found!"

Que se ve más corto así:

[ -f /tmp/foo.txt ] || echo "File not found!"

Prefiero hacer lo siguiente de una sola línea, en formato compatible con shell POSIX :

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

Para un par de comandos, como lo haría en un script:

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

¡Una vez que comencé a hacer esto, ya casi no uso la sintaxis completamente escrita!


Puedes negar una expresión con "!":

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

La página man relevante es man test o, de manera equivalente, man [ - o help test o help [ para el comando bash incorporado.


Vale la pena mencionar que si necesita ejecutar un solo comando puede abreviar

if [ ! -f "$file" ]; then
    echo "$file"
fi

a

test -f "$file" || echo "$file"

o

[ -f "$file" ] || echo "$file"

Prueba de archivo Bash

-b filename - Bloquear archivo especial
-c filename - archivo de caracteres especiales
-d directoryname - Comprobar existencia de directorio
-e filename : compruebe la existencia del archivo, independientemente del tipo (nodo, directorio, socket, etc.)
-f filename : compruebe si existe un archivo normal, no un directorio
-G filename : verifique si el archivo existe y es propiedad del ID de grupo efectivo
-G filename set-group-id - Verdadero si el archivo existe y es set-group-id
-k filename - bit pegajoso
-L filename - enlace simbólico
-O filename : verdadero si el archivo existe y es propiedad del ID de usuario efectivo
-r filename : verifica si el archivo es legible
-S filename - Comprobar si el archivo es socket
-s filename : compruebe si el archivo es de tamaño distinto de cero
-u filename : comprueba si el archivo set-user-id bit está establecido
-w filename - Verifica si el archivo es de escritura
-x filename - Comprueba si el archivo es ejecutable

Cómo utilizar:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

Una expresión de prueba puede ser negada usando la tecla ! operador

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 

[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

Además, es posible que el archivo sea un enlace simbólico roto, o un archivo no regular, como por ejemplo un socket, dispositivo o fifo. Por ejemplo, para agregar un cheque para enlaces simbólicos rotos:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi






scripting