Linux Bash Komut Dosyalarında Bir Dosyanın Var Olup Olmadığı Nasıl Kontrol Edilir

Yayınlanan: 2022-08-18
Bir bash istemi gösteren Linux dizüstü bilgisayar
fatmawati achmad zaenuri/Shutterstock.com

Bir 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 

chmod ile çalıştırılabilir bir komut dosyası yapma

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 

Normal bir dosyada script1.sh çalıştırma

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 

script1.sh'yi var olmayan bir dosyaya karşı çalıştırma

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 

script1.sh'yi bir aygıt dosyasına karşı çalıştırma

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 

script2.sh'yi bir karakter aygıt dosyasına karşı çalıştırma

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 

Bir blok cihaz dosyasına karşı scrip2.sh çalıştırma

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 

script3.sh karakter ve blok aygıt dosyalarını doğru şekilde ele alıyor

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 

script8.sh karakteri doğru bir şekilde tanımlar ve cihaz dosyalarını engeller

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 

script5.sh bir dosyanın var olup olmadığını ve okuma ve yazma izinlerinin ayarlanıp ayarlanmadığını kontrol etme

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 

script6.sh bir dizinin var olup olmadığını algılıyor

Yedek dizini oluşturuldu. Komut dosyasını tekrar çalıştırırsak, dizinin zaten mevcut olduğunu bildirmelidir.

 ./script6.sh 

script6.sh mevcut bir dizini yeniden kullanma

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?