Cara Memeriksa Apakah Ada File di Skrip Bash Linux

Diterbitkan: 2022-08-18
Laptop Linux menampilkan prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Jika skrip Bash Linux bergantung pada file atau direktori tertentu yang ada, itu tidak bisa hanya mengasumsikan mereka melakukannya. Itu perlu untuk memeriksa bahwa mereka pasti ada. Berikut cara melakukannya.

Jangan Berasumsi Apapun

Saat Anda menulis skrip, Anda tidak dapat membuat asumsi tentang apa yang ada dan tidak ada di komputer. Itu benar jika skrip akan didistribusikan dan dijalankan di banyak komputer yang berbeda. Cepat atau lambat, skrip akan berjalan di komputer yang tidak memenuhi asumsi Anda, dan skrip akan gagal atau berjalan secara tidak terduga.

Segala sesuatu yang kita nilai atau buat di komputer disimpan dalam file dengan format tertentu, dan semua file itu berada di direktori. Skrip dapat membaca, menulis, mengganti nama, menghapus, dan memindahkan file dan direktori—semua hal yang dapat Anda lakukan di baris perintah.

Keuntungan yang Anda miliki sebagai manusia adalah Anda dapat melihat isi direktori dan Anda tahu apakah ada file atau tidak—atau apakah direktori yang diharapkan memang ada. Jika skrip rusak saat memanipulasi file, itu bisa berakibat serius dan merusak.

Bash menyediakan serangkaian pengujian komprehensif yang dapat Anda gunakan untuk mendeteksi file dan direktori, dan menguji banyak atributnya. Memasukkan ini ke dalam skrip itu mudah, tetapi manfaatnya dalam hal ketahanan dan kontrol yang baik cukup besar.

TERKAIT: Cara Menggunakan Tes Kondisional Braket Ganda di Linux

Rentang Tes

Dengan menggabungkan pernyataan if dengan pengujian yang sesuai dari kumpulan besar pengujian file dan direktori, kita dapat dengan mudah menentukan apakah sebuah file ada, apakah itu dapat dieksekusi, atau dapat ditulis, dan banyak lagi.

  • -b : Mengembalikan nilai true jika file adalah file khusus blok.
  • -c : Mengembalikan nilai true jika file adalah karakter khusus.
  • -d : Mengembalikan nilai true jika "file" adalah direktori.
  • -e : Mengembalikan nilai true jika file ada.
  • -f : Mengembalikan nilai true jika file ada dan merupakan file biasa.
  • -g : Mengembalikan nilai true jika file memiliki set izin setgid ( chmod g+ ).
  • -h : Mengembalikan nilai true jika file adalah tautan simbolik.
  • -L : Mengembalikan nilai true jika file adalah tautan simbolik.
  • -k : Mengembalikan nilai true jika bit lengketnya disetel ( chmod +t ).
  • -p : Mengembalikan nilai true jika file adalah pipa bernama.
  • -r : Mengembalikan nilai true jika file dapat dibaca.
  • -s : Mengembalikan nilai true jika file ada dan tidak kosong.
  • -S : Mengembalikan nilai true jika file adalah soket.
  • -t : Mengembalikan nilai true jika deskriptor file dibuka di terminal.
  • -u : Mengembalikan nilai true jika file memiliki set izin setuid ( chmod u+ ).
  • -w : Mengembalikan nilai true jika file dapat ditulis.
  • -x : Mengembalikan nilai true jika file dapat dieksekusi.
  • -O : Mengembalikan nilai true jika milik Anda.
  • -G : Mengembalikan nilai true jika dimiliki oleh grup Anda.
  • -N : Mengembalikan nilai true jika file telah dimodifikasi sejak terakhir kali dibaca.
  • ! : Operator NOT logis.
  • && : Operator logika AND.
  • || : Operator logika OR.

Daftar dimulai dengan -b karena tes -a tidak digunakan lagi dan diganti dengan tes -e .

TERKAIT: Cara Menggunakan SUID, SGID, dan Sticky Bits di Linux

Menggunakan Tes dalam Skrip

Tes file generik if pernyataan adalah konstruksi skrip sederhana. Perbandingan di dalam tanda kurung ganda ” [[ ]] ” menggunakan tes -f untuk menentukan apakah ada file biasa dengan nama itu.

Salin teks skrip ini ke editor dan simpan ke dalam file bernama "script1.sh", dan gunakan chmod untuk membuatnya dapat dieksekusi.

 #!/bin/bash

jika [[ -f $1 ]] 

kemudian 

  echo "File $1 ada." 

kalau tidak 

  echo "File $1 tidak dapat ditemukan." 

fi

Anda harus meneruskan nama file ke skrip di baris perintah.

 chmod +x script1.sh 

Membuat skrip dapat dieksekusi dengan chmod

Anda harus melakukan ini dengan setiap skrip jika Anda ingin mencoba contoh lain dari artikel.

Mari kita coba skrip pada file teks langsung.

 ./script1.sh test-file.txt 

Menjalankan script1.sh pada file biasa

File ada dan skrip melaporkan fakta itu dengan benar. Jika kami menghapus file dan mencoba lagi, pengujian akan gagal dan skrip akan melaporkannya kepada kami.

 ./script1.sh test-file.txt 

Menjalankan script1.sh terhadap file yang tidak ada

Dalam situasi kehidupan nyata, skrip Anda perlu mengambil tindakan apa pun yang sesuai. Mungkin itu menandai kesalahan dan berhenti. Mungkin itu membuat file dan melanjutkan. Mungkin menyalin sesuatu dari direktori cadangan untuk mengganti file yang hilang. Itu semua tergantung pada tujuan skrip. Tapi setidaknya sekarang script sudah bisa mengambil keputusan berdasarkan mengetahui apakah file tersebut ada atau tidak.

Bendera -f menguji apakah file ada, dan merupakan file "biasa". Dengan kata lain, itu bukan sesuatu yang tampak seperti file tetapi sebenarnya bukan, seperti file perangkat.

Kami akan menggunakan ls untuk memverifikasi bahwa file “/ dev/random” ada, dan kemudian melihat apa yang dibuat dari skrip tersebut.

 ls -lh /dev/random
 ./script /dev/random 

Menjalankan script1.sh terhadap file perangkat

Karena skrip kami sedang menguji file biasa dan "/ dev/random" adalah file perangkat, pengujian gagal. Sangat sering, untuk mengetahui apakah suatu file ada, Anda harus hati-hati memilih tes mana yang Anda gunakan, atau Anda perlu menggunakan beberapa tes.

Ini adalah "script2.sh", yang menguji file biasa dan untuk file perangkat karakter.

 #!/bin/bash

jika [[ -f $1 ]]
kemudian
  echo "File $1 ada."
kalau tidak
  echo "File $1 hilang atau bukan file biasa."
fi

jika [[ -c $1 ]]
kemudian
  echo "File $1 adalah file perangkat karakter."
kalau tidak
  echo "File $1 hilang atau bukan file khusus." 
fi

Jika kita menjalankan skrip ini pada file perangkat “/dev/random”, pengujian pertama gagal seperti yang diharapkan, dan pengujian kedua berhasil. Ini mengenali file sebagai file perangkat.

 ./script2.sh /dev/random 

Menjalankan script2.sh terhadap file perangkat karakter

Sebenarnya, itu mengenalinya sebagai file perangkat karakter . Beberapa file perangkat memblokir file perangkat. Seperti berdiri, skrip kami tidak akan mengatasi itu.

 ./script2.sh /dev/sda 

Menjalankan scrip2.sh terhadap file perangkat blok

Kita dapat menggunakan operator logika OR dan memasukkan pengujian lain dalam pernyataan if kedua. Kali ini, apakah file tersebut adalah file perangkat karakter atau file perangkat blok, pengujian akan mengembalikan nilai true. Ini adalah "script3.sh."

 #!/bin/bash

jika [[ -f $1 ]]
kemudian
  echo "File $1 ada."
kalau tidak
  echo "File $1 hilang atau bukan file biasa."
fi

jika [[ -c $1 || -b $1 ]]
kemudian
  echo "File $1 adalah file karakter atau blok perangkat."
kalau tidak
  echo "File $1 hilang atau bukan file khusus." 
fi

Skrip ini mengenali perangkat karakter dan memblokir file perangkat.

 ./script3.sh /dev/random
 ./script3.sh /dev/sda 

script3.sh menangani karakter dan memblokir file perangkat dengan benar

Jika penting bagi Anda untuk membedakan antara berbagai jenis file perangkat, Anda dapat menggunakan pernyataan if bersarang. Ini adalah "script4.sh."

 #!/bin/bash

jika [[ -f $1 ]]
kemudian
  echo "File $1 ada."
kalau tidak
  echo "File $1 hilang atau bukan file biasa."
fi

jika [[ -c $1 ]]
kemudian
  echo "File $1 adalah file perangkat karakter."
kalau tidak
  jika [[ -b $1 ]]
  kemudian
    echo "File $1 adalah file perangkat blok." 
  kalau tidak
    echo "File $1 hilang atau bukan file perangkat."
  fi
fi

Skrip ini mengenali dan mengkategorikan perangkat karakter dan memblokir file perangkat.

 ./script4.sh /dev/random
 ./script4.sh /dev/sda 

script8.sh mengidentifikasi karakter dengan benar dan memblokir file perangkat

Dengan menggunakan operator logika AND, kita dapat menguji beberapa karakteristik sekaligus. Ini adalah "script5.sh." Ini memeriksa apakah ada file dan skrip telah membaca dan menulis izin untuk itu.

 #!/bin/bash

jika [[ -f $1 && -r $1 && -w $1 ]]
kemudian
  echo "File $1 ada dan kami memiliki izin baca/tulis."
kalau tidak
  echo "File $1 hilang, bukan file biasa, atau kami tidak dapat membaca/menulisnya."
fi

Kami akan menjalankan skrip pada file milik kami, dan file milik root .

 ./script5.sh .bashrc
 ./script5.sh /etc/fstab 

script5.sh memeriksa apakah ada file dan apakah izin baca dan tulis disetel

Untuk menguji keberadaan direktori, gunakan tes -d . Ini adalah "script6.sh." Ini adalah bagian dari skrip cadangan. Hal pertama yang dilakukan adalah memeriksa apakah direktori yang diteruskan pada baris perintah ada atau tidak. Ia menggunakan operator NOT logis ! dalam tes pernyataan if .

 #!/bin/bash

jika [[ ! -d $1 ]]
kemudian
  echo "Membuat direktori cadangan:" $1
  mkdir $1

  jika [[ ! $? -persamaan 0 ]]
  kemudian
    echo "Tidak dapat membuat direktori cadangan:" $1
    KELUAR
  fi
kalau tidak
  echo "Direktori cadangan ada."
fi

# lanjutkan dengan pencadangan file
echo "Mencadangkan ke: "$1

Jika direktori tidak ada, ia akan membuatnya. Jika file pembuatan direktori, skrip keluar. Jika pembuatan direktori berhasil, atau direktori sudah ada, skrip melanjutkan dengan tindakan pencadangannya.

Kami akan menjalankan skrip dan kemudian memeriksa dengan ls dan opsi -d (direktori) apakah direktori cadangan ada.

 ./script6.sh Dokumen/project-backup
 ls -d Dokumen/proyek-cadangan 

script6.sh mendeteksi apakah ada direktori

Direktori cadangan telah dibuat. Jika kita menjalankan skrip lagi, itu akan melaporkan bahwa direktori sudah ada.

 ./script6.sh 

script6.sh menggunakan kembali direktori yang ada

Script menemukan direktori dan melanjutkan untuk melakukan pencadangan.

Uji, Jangan Asumsi

Cepat atau lambat, asumsi akan menyebabkan hal-hal buruk terjadi. Uji terlebih dahulu, dan bereaksilah sesuai dengan itu.

Pengetahuan adalah kekuatan. Gunakan tes untuk memberi skrip Anda pengetahuan yang mereka butuhkan.

TERKAIT: Bagaimana Membiarkan Skrip Linux Mendeteksi Mereka Berjalan di Mesin Virtual