Apakah ada perintah untuk menampilkan pesan "Ya" jika ada file tertentu? Tidak perlu memberikan fungsionalitas jika file tidak ada.
command-line
james
sumber
sumber
[ -e FILENAME ] && echo Yes
FILENAME
ekspansi variabel, atau berisi karakter khusus, maka jangan lupa untuk mengutipnya. misalnya dalam naskah[ -e "$1" ] && echo Yes
,.[[
dan]]
bukannya mengutip variabel.[[ ]]
, selalu mengutip adalah kebiasaan yang baik untuk pemula yang tidak ingat aturan khusus untuk di dalam[[ ]]
operator, atau untuk konteks aritmatika.Anda dapat menggunakan skrip sederhana ini:
Simpan sebagai
file-exists.sh
. Kemudian, di Terminal, ketikchmod +x file-exists.sh
.Gunakan seperti:
./file-exists.sh FILE
tempat Anda menggantiFILE
dengan file yang ingin Anda periksa, misalnya:Jika
file.txt
ada,Yes
akan dicetak ke Terminal, dan program akan keluar dengan status 0 (berhasil). Jika file tidak ada, tidak ada yang akan dicetak dan program akan keluar dengan status 1 (gagal).Jika Anda penasaran mengapa saya memasukkan
exit
perintah, baca terus ...Ada apa dengan
exit
perintahnya?exit
menyebabkan pemutusan proses normal. Apa artinya ini, pada dasarnya: menghentikan skrip. Ini menerima parameter opsional (numerik) yang akan menjadi status keluar dari skrip yang memanggilnya.Status keluar ini memungkinkan skrip Anda yang lain untuk menggunakan
file-exists
skrip Anda dan cara mereka mengetahui file itu ada atau tidak.Contoh sederhana yang menggunakan ini adalah skrip ini (simpan sebagai
file-exists-cli.sh
):Melakukan hal yang biasa
chmod +x file-exists-cli.sh
dan kemudian menjalankannya:./file-exists-cli.sh
. Anda akan melihat sesuatu seperti ini:File ada (
exit 0
):File tidak ada (
exit 1
):sumber
"$1"
. Jika memiliki ruang putih di dalamnya, itu akan pecah tanpa tanda kutip dan hal-hal buruk lainnya dapat terjadi.Di shell bash pada baris perintah.
Ini menggunakan operator kondisional bash
-f
, dan sedang memeriksa apakah file tersebut ada dan merupakan file biasa. Jika Anda ingin menguji file apa pun termasuk direktori dan tautan kemudian gunakan-e
.Ini adalah sumber yang bagus untuk persyaratan bash.
sumber
test
dalam format aslinya, saya tahu ini berlebihan, tapi itu kebiasaan saya.[
perintah, yang biasanya memanggil builtin.) Mereka mengoreksi inkonsistensi dan perilaku bodoh dari versi penjepit tunggal. [Builtin tetap untuk kompatibilitas, tapi saya tidak melihat alasan bagus untuk menggunakannya dalam kode bash baru. (Jika Anda perlu menulis skrip POSIX-compliant yang dapat berjalan di shell kuno atau sesuatu, itu berbeda.)[
biasanya memanggil builtin" meragukan.type -a [
bagi saya daftar "shell builtin", lalu "/usr/bin/[
."type
Hasil Anda tampaknya menguatkan apa yang saya katakan, bukan?Perintah terpendek untuk melakukan apa yang Anda inginkan adalah:
test -e
akan menguji apakah nama yang diberikan ada di sistem file. (Anda dapat menggunakantest -f
untuk membatasi hanya file biasa. Lihatman test
lebih lanjut.)Jika kondisi yang diberikan bernilai true, maka
test
mengembalikan status keluar yang berhasil (jika tidak mengembalikan status kegagalan). Kami menggabungkan dua perintah menggunakan&&
, yang berarti "mengeksekusi perintah berikutnya jika perintah sebelumnya keluar dengan status sukses". Perintah selanjutnya hanya mencetakYes
pada output standar; dalam kasus shell interaktif, di terminal.Ini menghindari bahan tekstual tambahan dari sebuah
if
pernyataan, namun memberikan hasil yang sama. Menggunakan&&
(atau kebalikannya,||
) untuk mengikat perintah bekerja dengan baik ketika hanya satu perintah yang terlibat. Jika Anda ingin melakukan lebih dari satu perintah dalam menanggapi status keluar satu perintah, maka menggunakanif
sintaks dengan cepat menjadi jauh lebih mudah dibaca.Seperti yang sudah ditunjukkan dalam jawaban lain,
if
konstruk gaya yang setara adalah:atau sebagai alternatif:
Untuk tujuan ini,
[
dantest
setara, kecuali yang[
menuntut penghentian]
.sumber
Untuk menguliti jenis pertanyaan ini ada beberapa cara, dan inilah satu lagi: gunakan
find
perintah dengan-exec
flag. Path ke file dapat dibagi menjadi dua bagianfind /etc
yang menetapkan direktori dan-name FILENAME
yang menentukan nama file (ya!).-maxdepth
akan tetapfind
bekerja dengan/etc
direktori saja dan tidak akan turun ke subdirektoriCara lain, melalui
stat
:Dan sebagai alternatif melalui python:
Atau alternatif baris perintah pendek:
sumber