Linux Bash Komut Dosyalarında Bir Dosyanın Var Olup Olmadığı Nasıl Kontrol Edilir
Yayınlanan: 2022-08-18Bir Linux Bash betiği, belirli dosya veya dizinlerin mevcut olmasına dayanıyorsa, öyle olduklarını varsayamaz. Kesinlikle orada olup olmadıklarını kontrol etmesi gerekiyor. İşte bunu nasıl yapacağınız.
Hiçbir Şeyi Varsayma
Bir komut dosyası yazarken, bilgisayarda neyin mevcut olup olmadığı hakkında varsayımlarda bulunamazsınız. Komut dosyası dağıtılacak ve birçok farklı bilgisayarda çalıştırılacaksa, bu iki kat doğrudur. Er ya da geç, komut dosyası varsayımlarınızı karşılamayan bir bilgisayarda çalışacak ve komut dosyası başarısız olacak veya öngörülemeyen bir şekilde çalışacak.
Bir bilgisayarda değer verdiğimiz veya yarattığımız her şey, bir biçimde bir dosyada saklanır ve bu dosyaların tümü bir dizinde bulunur. Komut dosyaları, komut satırında yapabileceğiniz her şeyi okuyabilir, yazabilir, yeniden adlandırabilir, silebilir ve taşıyabilir.
Bir insan olarak sahip olduğunuz avantaj, bir dizinin içeriğini görebilmeniz ve bir dosyanın var olup olmadığını veya beklenen dizinin var olup olmadığını bilmenizdir. Bir komut dosyası, dosyaları değiştirirken hata verirse, ciddi ve zarar verici sonuçlar doğurabilir.
Bash, dosyaları ve dizinleri tespit etmek ve birçok özniteliğini test etmek için kullanabileceğiniz kapsamlı bir test seti sağlar. Bunları komut dosyalarına dahil etmek kolaydır, ancak sağlamlık ve hassas kontrol açısından faydaları oldukça fazladır.
İLGİLİ: Linux'ta Çift Parantez Koşullu Testleri Nasıl Kullanılır
Test Aralığı
if ifadesini geniş bir dosya ve dizin testleri koleksiyonundan uygun testle birleştirerek, bir dosyanın var olup olmadığını, yürütülebilir veya yazılabilir olup olmadığını ve çok daha fazlasını kolayca belirleyebiliriz.
- -b : Dosya blok özel bir dosyaysa true değerini döndürür.
- -c : Dosya özel karakter ise true döndürür.
- -d : "Dosya" bir dizinse true değerini döndürür.
- -e : Dosya varsa true değerini döndürür.
- -f : Dosya varsa ve normal bir dosyaysa true değerini döndürür.
- -g : Dosya
setgid
izin setine sahipse (chmod g+
) true döndürür. - -h : Dosya sembolik bir bağlantıysa true değerini döndürür.
- -L : Dosya sembolik bir bağlantıysa true değerini döndürür.
- -k : Yapışkan biti ayarlanmışsa (
chmod +t
) true değerini döndürür. - -p : Dosya adlandırılmış bir kanal ise true değerini döndürür.
- -r : Dosya okunabilir ise true değerini döndürür.
- -s : Dosyalar varsa ve boş değilse true değerini döndürür.
- -S : Dosya bir soket ise true değerini döndürür.
- -t : Dosya tanımlayıcı bir uçbirimde açılırsa true değerini döndürür.
- -u : Dosya
setuid
izin setine sahipse (chmod u+
) true döndürür. - -w : Dosya yazılabilir ise true değerini döndürür.
- -x : Dosya yürütülebilir ise true değerini döndürür.
- -O : Size aitse true değerini döndürür.
- -G : Grubunuza aitse true değerini döndürür.
- -N : Dosya son okunduğundan beri değiştirilmişse true değerini döndürür.
- ! : Mantıksal DEĞİL operatörü.
- && : Mantıksal AND operatörü.
- || : Mantıksal VEYA operatörü.
-a
testi kullanımdan kaldırıldığı ve -e
testi ile değiştirildiği için liste -b
ile başlar.
İLGİLİ: Linux'ta SUID, SGID ve Yapışkan Bitler Nasıl Kullanılır
Komut Dosyalarında Testleri Kullanma
Genel dosya testi if
ifadesi, basit bir komut dosyası oluşturma yapısıdır. Çift parantez ” [[ ]]
” içindeki karşılaştırma, bu ada sahip normal bir dosyanın olup olmadığını belirlemek için -f
testini kullanır.
Bu betiğin metnini bir düzenleyiciye kopyalayın ve “script1.sh” adlı bir dosyaya kaydedin ve yürütülebilir hale getirmek için chmod
kullanın.
#!/bin/bash eğer [[ -f $1 ]] sonra echo "$1 dosyası var." başka echo "$1 dosyası bulunamadı." fi
Dosyanın adını komut satırındaki komut dosyasına iletmelisiniz.
chmod +x script1.sh
Makaledeki diğer örnekleri denemek istiyorsanız, bunu her komut dosyasıyla yapmanız gerekir.
Komut dosyasını basit bir metin dosyası üzerinde deneyelim.
./script1.sh test dosyası.txt
Dosya var ve komut dosyası bu gerçeği doğru bir şekilde bildiriyor. Dosyayı silip tekrar denersek, test başarısız olmalı ve komut dosyası bunu bize bildirmelidir.
./script1.sh test dosyası.txt
Gerçek hayattaki bir durumda, senaryonuzun uygun olan her şeyi yapması gerekir. Belki de hatayı işaretler ve durur. Belki dosyayı oluşturur ve devam eder. Eksik dosyayı değiştirmek için bir yedekleme dizininden bir şey kopyalayabilir. Her şey senaryonun amacına bağlıdır. Ama en azından şimdi komut dosyası, dosyanın mevcut olup olmadığını bilerek karar verebilir.
-f
bayrağı, dosyanın mevcut olup olmadığını ve "normal" bir dosya olup olmadığını test eder. Başka bir deyişle, cihaz dosyası gibi bir dosya gibi görünen ama olmayan bir şey değildir.
“/dev/random” dosyasının var olduğunu doğrulamak için ls kullanacağız ve ardından betiğin bundan ne çıkardığını göreceğiz.
ls -lh /dev/rastgele
./script /dev/random
Komut dosyamız normal dosyaları test ettiğinden ve “/dev/random” bir aygıt dosyası olduğundan, test başarısız olur. Çoğu zaman, bir dosyanın var olup olmadığını anlamak için hangi testi kullanacağınızı dikkatlice seçmeniz veya birkaç test kullanmanız gerekir.
Bu, normal dosyaları ve karakter aygıtı dosyalarını test eden "script2.sh" dir.
#!/bin/bash eğer [[ -f $1 ]] sonra echo "$1 dosyası var." başka echo "$1 dosyası eksik veya normal bir dosya değil." fi eğer [[ -c $1 ]] sonra echo "$1 dosyası bir karakter aygıt dosyasıdır." başka echo "$1 dosyası eksik veya özel bir dosya değil." fi
Bu betiği “/dev/random” cihaz dosyasında çalıştırırsak, ilk test beklediğimiz gibi başarısız olur ve ikinci test başarılı olur. Dosyayı bir aygıt dosyası olarak tanır.
./script2.sh /dev/random
Aslında, onu bir karakter aygıt dosyası olarak tanır. Bazı cihaz dosyaları blok cihaz dosyalarıdır. Halihazırda, senaryomuz bunlarla baş etmeyecek.
./script2.sh /dev/sda
Mantıksal OR
operatörünü kullanabilir ve ikinci if ifadesine başka bir test ekleyebiliriz. Bu sefer, dosyanın bir karakter cihaz dosyası mı yoksa bir blok cihaz dosyası mı olduğu, test doğru dönecektir. Bu "script3.sh."
#!/bin/bash eğer [[ -f $1 ]] sonra echo "$1 dosyası var." başka echo "$1 dosyası eksik veya normal bir dosya değil." fi eğer [[ -c $1 || -b $1 ]] sonra echo "$1 dosyası bir karakter veya blok aygıt dosyasıdır." başka echo "$1 dosyası eksik veya özel bir dosya değil." fi
Bu komut dosyası hem karakter aygıtını hem de blok aygıtı dosyalarını tanır.
./script3.sh /dev/random
./script3.sh /dev/sda
Farklı cihaz dosyası türleri arasında ayrım yapmak sizin için önemliyse, iç içe if
ifadelerini kullanabilirsiniz. Bu "script4.sh."
#!/bin/bash eğer [[ -f $1 ]] sonra echo "$1 dosyası var." başka echo "$1 dosyası eksik veya normal bir dosya değil." fi eğer [[ -c $1 ]] sonra echo "$1 dosyası bir karakter aygıt dosyasıdır." başka eğer [[ -b $1 ]] sonra echo "$1 dosyası bir blok aygıt dosyasıdır." başka echo "$1 dosyası eksik veya bir aygıt dosyası değil." fi fi
Bu komut dosyası hem karakter aygıtını hem de blok aygıtı dosyalarını tanır ve kategorilere ayırır.
./script4.sh /dev/random
./script4.sh /dev/sda
Mantıksal AND operatörünü kullanarak aynı anda birkaç özelliği test edebiliriz. Bu "script5.sh." Bir dosyanın var olup olmadığını ve komut dosyasının bunun için okuma ve yazma izinlerine sahip olup olmadığını kontrol eder.
#!/bin/bash eğer [[ -f $1 && -r $1 && -w $1 ]] sonra echo "$1 dosyası var ve okuma/yazma izinlerimiz var." başka echo "$1 dosyası eksik, normal bir dosya değil veya onu okuyamıyoruz/yazamıyoruz." fi
Komut dosyasını bize ait olan ve root
ait olan bir dosyada çalıştıracağız.
./script5.sh .bashrc
./script5.sh /etc/fstab
Bir dizinin varlığını test etmek için -d
testini kullanın. Bu "script6.sh." Bir yedekleme komut dosyasının bir parçasıdır. Yaptığı ilk şey, komut satırında geçen dizinin var olup olmadığını kontrol etmektir. Mantıksal NOT
operatörünü kullanır !
if
deyimi testinde.
#!/bin/bash eğer [[ ! -d $1 ]] sonra echo "Yedek dizini oluşturuluyor:" $1 mkdir $1 eğer [[ ! $? -eq 0 ]] sonra echo "Yedek dizini oluşturulamadı:" $1 çıkış fi başka echo "Yedekleme dizini var." fi # dosya yedeklemeye devam et echo "Yedekleniyor: "$1
Dizin yoksa, onu oluşturur. Dizin oluşturma dosyaları ise, komut dosyası çıkar. Dizinin oluşturulması başarılı olursa veya dizin zaten mevcutsa, komut dosyası yedekleme eylemlerine devam eder.
Komut dosyasını çalıştıracağız ve ardından ls
ve -d
(dizin) seçeneği ile yedekleme dizininin olup olmadığını kontrol edeceğiz.
./script6.sh Belgeler/proje yedekleme
ls -d Belgeler/proje yedekleme
Yedek dizini oluşturuldu. Komut dosyasını tekrar çalıştırırsak, dizinin zaten mevcut olduğunu bildirmelidir.
./script6.sh
Komut dizini bulur ve yedeklemeyi gerçekleştirmek için devam eder.
Test Et, Varsayma
Er ya da geç, varsayımlar kötü şeylerin olmasına yol açacaktır. Önce test edin ve buna göre tepki verin.
Bilgi Güçtür. Komut dosyalarınıza ihtiyaç duydukları bilgiyi vermek için testleri kullanın.
İLGİLİ: Linux Komut Dosyalarının Sanal Makinelerde Çalıştıklarını Algılamasına Nasıl İzin Verilir?