Pertanyaan Bagaimana saya tahu jika file biasa tidak ada di Bash?


Saya telah menggunakan skrip berikut untuk melihat apakah file ada:

#!/bin/bash

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

Apa sintaks yang benar untuk digunakan jika saya hanya ingin memeriksa apakah file itu benar tidak ada?

#!/bin/bash

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

2507
2018-03-12 14:48


asal


Jawaban:


Itu uji perintah ([ di sini) memiliki operator "tidak" logis yang merupakan tanda seru (mirip dengan banyak bahasa lain). Coba ini:

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

3520
2018-03-12 14:50



Pengujian File Bash

-b filename - Blokir file khusus
-c filename - File karakter khusus
-d directoryname - Periksa Keberadaan direktori
-e filename - Periksa keberadaan file, apa pun jenisnya (node, direktori, socket, dll.)
-f filename - Periksa keberadaan file biasa bukan direktori
-G filename - Periksa apakah file ada dan dimiliki oleh ID grup yang efektif
-G filename set-group-id - True jika file ada dan set-group-id
-k filename - Lengket
-L filename - Tautan simbolis
-O filename - Benar jika file ada dan dimiliki oleh id pengguna yang efektif
-r filename - Periksa apakah file dapat dibaca
-S filename - Periksa apakah file adalah socket
-s filename - Periksa apakah file berukuran tidak nol
-u filename - Periksa apakah file set-user-id bit diatur
-w filename - Periksa apakah file bisa ditulis
-x filename - Periksa apakah file bisa dieksekusi

Bagaimana cara menggunakan:

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

SEBUAH tes ekspresi dapat dinegasikan dengan menggunakan ! operator

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

427
2018-01-16 14:25



Anda dapat meniadakan ekspresi dengan "!":

#!/bin/bash
FILE=$1

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

Halaman man yang relevan adalah man test atau, dengan kata lain, man [ -- atau help test atau help [ untuk perintah bash built-in.


250
2018-03-12 14:50



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

Juga, mungkin file tersebut adalah tautan simbolik yang rusak, atau file non-reguler, seperti misalnya soket, perangkat atau fifo. Misalnya, untuk menambahkan cek untuk symlink rusak:

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

110
2018-03-12 14:52



Perlu disebutkan bahwa jika Anda perlu menjalankan satu perintah, Anda dapat menyingkatnya

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

untuk

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

atau

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

80
2017-08-11 09:15



Saya lebih suka melakukan satu baris berikut, di POSIX format yang kompatibel dengan shell:

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

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

Untuk beberapa perintah, seperti yang akan saya lakukan dalam skrip:

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

Setelah saya mulai melakukan ini, saya jarang menggunakan sintaks yang diketik sepenuhnya lagi !!


56
2017-10-18 16:09



Untuk menguji keberadaan file, parameter dapat berupa salah satu dari yang berikut:

-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

Semua tes di bawah ini berlaku untuk file biasa, direktori, dan symlink:

-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

Contoh skrip:

#!/bin/bash
FILE=$1

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

36
2017-12-19 12:47



Anda harus berhati-hati untuk berlari test untuk variabel tanpa tanda kutip, karena mungkin menghasilkan hasil yang tidak diharapkan:

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

Rekomendasi biasanya untuk memiliki variabel yang diuji dikelilingi oleh tanda kutip ganda:

#!/bin/sh
FILE=$1

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

28
2018-01-24 19:43



Ada tiga cara berbeda untuk melakukan ini:

  1. Meniadakan status keluar dengan bash (tidak ada jawaban lain yang mengatakan ini):

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

    Atau:

    ! [ -e "$file" ] && echo "file does not exist"
    
  2. Negasikan tes di dalam perintah uji [ (Itulah cara sebagian besar jawaban sebelum disajikan):

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

    Atau:

    [ ! -e "$file" ] && echo "file does not exist"
    
  3. Bertindak atas hasil tes menjadi negatif (|| dari pada &&):

    Hanya:

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

    Ini terlihat konyol (IMO), jangan menggunakannya kecuali kode Anda harus portabel ke Bourne shell (seperti /bin/sh Solaris 10 atau sebelumnya) yang tidak memiliki operator negasi pipa (!):

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

18
2017-08-05 18:10



Kamu bisa melakukan ini:

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

atau

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

Jika Anda ingin memeriksa file dan folder keduanya, kemudian gunakan -epilihan bukan -f. -e mengembalikan true untuk file biasa, direktori, soket, file khusus karakter, blok file khusus, dll.


14
2018-04-28 19:40