Anasayfa » nasıl » Başlangıç ​​için Shell Scripting 2 Döngüsü Kılavuzu

    Başlangıç ​​için Shell Scripting 2 Döngüsü Kılavuzu

    Geek cred'inizi oluşturmak istiyorsanız, kabuk kodlama serimizdeki ikinci bölüm için bize katılın. Birkaç düzeltme, geçen haftaki senaryoda birkaç iyileştirme ve başlatılmamışlar için döngü konusunda bir rehberimiz var..

    Datecp Komut Dosyası Tekrar Ziyaret Edildi

    Kabuk komut dosyası kılavuzumuzun ilk bölümünde, dosyayı dosya adının sonuna ekledikten sonra bir dosyayı bir yedekleme dizinine kopyalayan bir komut dosyası yaptık..

    Samuel Dionne-Riel, yorumlardaki değişken referanslarımızı ele almanın daha iyi bir yolu olduğunu belirtti..

    Argümanlar bash kabuğunda boşlukla ayrılır, sonuçta genişletilmiş komutta bir boşluk olduğunda belirteç verir. Komut dosyanızda, cp $ 1 $ 2. $ date_formatted genişletilmiş değişkenler içinde boşluk olmadığı sürece amaçlandığı gibi çalışacaktır. Senaryonuzu bu şekilde çağırırsanız: datecp "eski adım" "yeni adım" genişletme bu komutla sonuçlanacaktır: cp yeni ismim eski ismim.the_date Aslında 6 argüman var.

    Bu sorunu düzgün bir şekilde gidermek için, komut dosyasının son satırı şöyle olmalıdır: cp "$ 1" "$ 2. $ date_formatted"

    Gördüğünüz gibi, betiğimizin satırını şu konumdan değiştirmek:

    cp -iv $ 1 $ 2. $ date_formatted

    için:

    cp -iv “$ 1” “$ 2”. $ date_formatted

    betiği adında boşluk olan dosyalarda kullanırken bu sorunu çözecektir. Samuel ayrıca, bu siteden (ya da genel olarak internetten) kod kopyalayıp yapıştırırken, genellikle onları değiştiren “tipografik olarak daha iyi” olanlar için uygun çizgi ve tırnakların kullanıldığından emin olduğunun da altını çiziyor. Ayrıca, kodumuzun daha kopya / yapıştırma dostu olduğundan emin olmak için daha fazlasını yapacağız. ;-)

    Başka bir yorumcu Myles Braithwaite, tarihin dosya uzantısından önce görünmesi için komut dosyamızı genişletmeye karar verdi. Yani yerine

    tastyfile.mp3.07_14_11-12.34.56

    bunu alırdık:

    tastyfile.07_14_11-12.34.56.mp3

    bu da çoğu kullanıcı için biraz daha uygun hale geliyor. Kodunu GitHub sayfasında bulabilirsiniz. Dosya adını ayırmak için ne kullandığına bir göz atalım.

    date_formatted = $ (tarih +% Y-% m-% d_% H.% M% S)
    file_extension = $ ("$ 1" eko | awk -F. 'baskı $ NF')
    file_name = $ (temel ad $ 1. $ file_extension)

    cp -iv $ 1 $ dosya_adı- $ date_formatted. $ file_extension

    Biçimlendirmeyi biraz değiştirdim, ancak Myles'in tarih işlevini Satır 1'de açıkladığını görebilirsiniz. Satır 2'de, dosyanın adını çıkarmak için betiğin ilk argümanıyla “echo” komutunu kullanır. Bu komutu almak için pipe komutunu kullanır ve bir sonraki kısım için girdi olarak kullanır. Borudan sonra Myles, güçlü bir tarama programı olan “awk” komutunu çağırıyor. -F bayrağını kullanarak bir sonraki karakterin (bir boşluktan sonra) “alan ayırıcıyı” tanımlayacak olan komut olduğunu söyler. Bu durumda, bu bir dönem.

    Şimdi, awk, “tastyfile” ve “mp3” olmak üzere iki alandan oluşan “tastyfile.mp3” adlı bir dosyayı görüyoruz. Son olarak, kullanır

    '$ NF yazdır'

    Son alanı görüntülemek için Dosyanızın birden çok periyodu olması durumunda - bu nedenle awk'nin birden çok alanı görmesini sağlayın - yalnızca sonuncuyu görüntüler, dosya uzantısı.

    3. satırda, dosyanın adı için yeni bir değişken oluşturur ve $ 1 içindeki her şeye başvurmak için “basename” komutunu kullanır. dışında dosya uzantısı. Bu, basename kullanılarak ve argüman olarak $ 1 vererek, ardından bir boşluk ve dosya uzantısı ekleyerek yapılır. Dosya uzantısı, Satır 2'ye başvuru yapan değişken nedeniyle otomatik olarak eklenir.

    tastyfile.mp3

    ve çevir

    tastyfile

    Ardından son satırda Myles, her şeyi sırayla veren komutu bir araya getirdi. Senaryo için ikinci bir argüman olan $ 2 referansının olmadığını unutmayın. Bu komut dosyası, söz konusu dosyayı geçerli dizininize kopyalar. Büyük iş Samuel ve Myles!

    Scriptler ve $ PATH Koşu

    Ayrıca Temel makalemizde, komut dosyalarının varsayılan olarak komut olarak referans alınmasına izin verilmediğinden bahsediyoruz. Diğer bir deyişle, onu çalıştırmak için betiğin yolunu göstermeniz gerekir:

    ./senaryo

    ~ / Bin / script

    Ancak, komut dosyalarınızı ~ / bin / dizinine koyarak isimlerini çalıştırmak için isimlerini herhangi bir yerden yazabilirsiniz..

    Yorum yapanlar, modern Linux dağıtımının hiçbiri varsayılan olarak bu dizini oluşturmadığından, bunun ne kadar uygun olduğunu tartışmak için biraz zaman harcadı. Ayrıca, hiç kimse varsayılan olarak $ PATH değişkenine de eklemez; bu, komut dosyalarının komutlar gibi çalıştırılması için gereken şeydir. Biraz şaşırmıştım çünkü $ PATH değişkenimi kontrol ettikten sonra yorum yapanlar haklıydı, fakat komut dosyaları çağırmak hala benim için çalışıyordu. Nedenini öğrendim: Modern Linux dağıtımlarının çoğu kullanıcının ana dizininde özel bir dosya yaratıyor.

    Bu dosya bash ile okunur (eğer .bash_profile kullanıcının ana dizininde mevcut değilse) ve altta, varsa / / bin / klasörünü $ PATH değişkenine ekleyen bir bölüm var. Böylece, bu gizem çözüldü. Serinin geri kalanı için ~ / bin / dizinine komut dosyaları yerleştirmeye devam edeceğim çünkü bunlar kullanıcı komut dosyalarıdır ve kullanıcılar tarafından çalıştırılabilmelidir. Ve görünen o ki, işlerin yürümesi için $ PATH değişkenini elle karıştırmaya ihtiyacımız yok..

    Tekrarlı Komutlar Döngülerle

    Tekrarlayan görevlerle uğraşmak için inek cephaneliğindeki en kullanışlı araçlardan birine gidelim: döngüler. Bugün “for” döngülerinden bahsedeceğiz..

    Bir for-loop'un ana hatları aşağıdaki gibidir:

    LİSTEDE DEĞİŞKEN için; yap
    command1
    command2
    ...
    commandn
    tamam

    VARIABLE herhangi bir değişken olabilir, ancak çoğunlukla “i” küçük harf kongre tarafından kullanılır. LİSTE bir öğe listesidir; birden fazla öğe belirleyebilir (bunları bir boşlukla ayırarak), harici bir metin dosyasına işaret edebilir veya geçerli dizindeki herhangi bir dosyayı belirtmek için yıldız işareti (*) kullanabilirsiniz. Listelenen komutlar kurallarla girintilidir, bu nedenle iç içe geçme görmek kolaydır - döngülere döngü koyarak (böylece döngü yaparken döngü yapabilirsiniz).

    Listeler boşlukları sınırlayıcı olarak kullandığından - boşluk, listedeki bir sonraki öğeye geçişi gösterir - adında boşluk bulunan dosyalar çok kolay değildir. Şimdilik boşluksuz dosyalar ile çalışmaya devam edelim. Geçerli dizindeki dosyaların adlarını görüntülemek için basit bir betikle başlayalım. ~ / Bin / klasörünüzde “loopscript” başlıklı yeni bir komut dosyası oluşturun. Bunu nasıl yapacağınızı hatırlamıyorsanız (çalıştırılabilir olarak işaretlemek ve hash bang hack'ını eklemek dahil) bash komut dosyasıyla ilgili temel makalemize bakın..

    İçine aşağıdaki kodu girin:

    i için item1 item2 item3 item4 item5 item6; yap
    echo “$ i”
    tamam

    Komut dosyasını çalıştırdığınızda, bu liste öğelerini çıktı olarak almanız gerekir..

    Oldukça basit değil mi? İşleri biraz değiştirirsek ne olacağını görelim. Komut dosyanızı değiştirin, böylece şunu söyleyin:

    i * için; yap
    echo “$ i”
    tamam

    Bu betiği bir klasörde çalıştırdığınızda, çıktı olarak içerdiği dosyaların bir listesini almalısınız..

    Şimdi, echo komutunu daha kullanışlı bir şeye çevirelim: örneğin, zip komutu. Yani, bir arşive dosya ekleyeceğiz. Ve, karışımda bazı argümanlar alalım!

    $ @ içinde; yap
    zip arşiv “$ i”
    tamam

    Yeni bir şey var! “$ @” “$ 1 $ 2 2 $ 3… $ n” kısayolu. Başka bir deyişle, belirttiğiniz tüm argümanların tam listesi. Şimdi, komut dosyasını birkaç girdi dosyasıyla çalıştırdığımda ne olacağını izleyin.

    Hangi dosyaların klasörümde olduğunu görebilirsiniz. Komutu altı argümanla çalıştırdım ve her dosya “archive.zip” adlı sıkıştırılmış bir arşive eklendi. Kolay değil mi?

    Çünkü döngüler çok güzel. Artık toplu iş fonksiyonlarını dosya listelerinde çalıştırabilirsiniz. Örneğin, komut dosyanızın tüm argümanlarını sıkıştırılmış bir arşive kopyalayabilir, orijinalleri farklı bir klasöre taşıyabilir ve bu zip dosyasını otomatik olarak uzak bir bilgisayara kopyalayabilirsiniz. SSH ile anahtar dosyalar kurarsanız, şifrenizi girmeniz bile gerekmez ve hatta kodun yükledikten sonra zip dosyasını silmesini bile söyleyebilirsiniz.!


    For-loop'ları kullanmak, bir dizindeki tüm dosyalar için bir sürü işlem yapmayı kolaylaştırır. Çok çeşitli komutları bir araya getirebilir ve argümanları kolayca oluşturmak ve anında liste oluşturmak için kullanabilirsiniz; bu buzdağının yalnızca görünen kısmı.

    Bash scriptleri, herhangi bir öneriniz var mı? Döngüler kullanan yararlı bir komut dosyası yaptınız mı? Dizi hakkındaki düşüncelerinizi paylaşmak ister misiniz? Bazı yorumlar bırakın ve diğer komut dosyalarına yeni başlayanlara yardım edin!