Cara Memeriksa Apakah Ada File di Skrip Bash Linux
Diterbitkan: 2022-08-18Jika 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
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
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
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
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
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
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
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
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
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
Direktori cadangan telah dibuat. Jika kita menjalankan skrip lagi, itu akan melaporkan bahwa direktori sudah ada.
./script6.sh
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