bash - valor - shell script variavel recebe comando




Como posso saber se um arquivo regular não existe no Bash? (12)

Eu usei o seguinte script para ver se existe um arquivo:

#!/bin/bash

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

Qual é a sintaxe correta para usar se eu quiser apenas verificar se o arquivo não existe?

#!/bin/bash

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

às vezes pode ser útil usar o && and || operadores.

Como em (se você tiver o comando "teste"):

test -b $FILE && echo File not there!

ou

test -b $FILE || echo File there!

A maneira mais simples

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

Este código também está funcionando.

#!/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 também funciona para localizar um arquivo em um diretório:

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

Existem três maneiras distintas de fazer isso:

  1. Negue o status de saída com bash (nenhuma outra resposta disse isso):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi
    

    Ou:

    ! [ -e "$file" ] && echo "file does not exist"
    
  2. Negue o teste dentro do comando test [ (é assim que a maioria das respostas anteriores foi apresentada):

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi
    

    Ou:

    [ ! -e "$file" ] && echo "file does not exist"
    
  3. Agir sobre o resultado do teste sendo negativo ( || invés de && ):

    Somente:

    [ -e "$file" ] || echo "file does not exist"
    

    Isso parece bobo (IMO), não o use a menos que seu código precise ser portável para o shell Bourne (como o /bin/sh do Solaris 10 ou anterior) que não possuísse o operador de negação de pipeline ( ! ):

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi
    


Para reverter um teste, use "!". Isso é equivalente ao operador "não" lógico em outros idiomas. Tente isto:

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

Ou escrito de uma maneira um pouco diferente:

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

Ou você poderia usar:

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

Ou, presing todos juntos:

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

Que pode ser escrito (usando então "e" operador: &&) como:

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

Que parece mais curto assim:

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

Para testar a existência do arquivo, o parâmetro pode ser qualquer um dos seguintes:

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

Todos os testes abaixo se aplicam a arquivos, diretórios e links simbólicos regulares:

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

Exemplo de script:

#!/bin/bash
FILE=$1

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

Você consegue fazer isso:

[[ ! -f "$FILE" ]] && echo "File doesn't exist"

ou

if [[ ! -f "$FILE" ]]; then
    echo "File doesn't exist"
fi

Se você quiser verificar o arquivo e a pasta, use a opção -e vez de -f . -e retorna true para arquivos regulares, diretórios, socket, arquivos especiais de caracteres, arquivos especiais de bloco, etc.


Você deve ter cuidado ao executar o test para uma variável sem aspas, porque pode produzir resultados inesperados:

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

A recomendação é geralmente ter a variável testada entre aspas duplas:

#!/bin/sh
FILE=$1

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

Teste de arquivo de bash

-b filename - Bloquear arquivo especial
-c filename - arquivo de caractere especial
-d directoryname - Verifique o diretório Existence
-e filename - Verifica a existência do arquivo, independentemente do tipo (nó, diretório, soquete, etc.)
-f filename - Verificar existência de arquivo regular e não um diretório
-G filename - Verifique se o arquivo existe e é de propriedade de um ID de grupo efetivo
-G filename set-group-id - Verdadeiro se o arquivo existir e for set-group-id
-k filename - Sticky bit
-L filename - Link simbólico
-O filename - Verdadeiro se o arquivo existir e pertencer ao ID do usuário efetivo
-r filename - Verifique se o arquivo é legível
-S filename - Verifique se o arquivo é o soquete
-s filename - Verifique se o arquivo tem tamanho diferente de zero
-u filename - Verifique se o bit set-user-id está definido
-w filename - Verifique se o arquivo é gravável
-x filename - Verifique se o arquivo é executável

Como usar:

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

Uma expressão de teste pode ser negada usando o ! 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"

Além disso, é possível que o arquivo seja um link simbólico quebrado ou um arquivo não regular, como, por exemplo, um soquete, dispositivo ou fifo. Por exemplo, para adicionar uma verificação de links simbólicos quebrados:

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