0. Dizin
- Çoğu insanın başına gelen şeyler
- Bir komut dosyasının yapısı
- Ekranda yazdır
- Kullanıcı GİRİŞİNİ oku
- Bash'de hesaplamalar
- Şartlar
- Döngüler
- fonksiyonlar
- Getop'lar
1. Çoğu insanın başına gelen şeyler
/ bin / bash veya / bin / sh
Betiğimizi çalıştırırken makinenin yaptığı ilk şeylerden biri, onu hangi kabukla yapması gerektiğine bakmaktır. En güncel linux sistemlerinde / Bin / sh bir bağlantıdır / bin / bash, ancak bu her zaman geçerli değildir, örneğin kullanan dağıtımlarda meşgul kutusu getiriyorlar Sh ve genellikle onlar da getirir Cümbüşama eğer kullanırsan / Bin / shBash ile çalışmayacaktır. Bu yüzden her zaman kullanmanızı tavsiye ederim / bin / bash.
Unicode ve ASCII
Senaryolarınızda neden "¿" veya "ñ" kullanamadığınızı hiç merak ettiniz mi? Veya aksan kullanmak mı? Etkileşimli komut dosyalarında oldukça can sıkıcı olabilir. Bunun nedeni, Bash'in varsayılan kodlamasının ASCII veya aynısı olan İngilizce karakter kümesidir. Bunu değiştirmek için, betiğimize Unicode kullanmak istediğimizi söylememiz yeterlidir. Bunun için komut yorumlayıcısından hemen sonra bir satır eklemelisiniz:
# - * - KODLAMA: UTF-8 - * -
Dikkatli olun, bu satırın senaryonun başında olması önemlidir.
Komut dosyasını çalıştırılabilir yapın
Senaryoları kaç kişinin çalıştırdığı komiktir «$ bash komut dosyası.sh" onun yerine "$ ./script.shSonuçta, bunun için bir kabuk tanımladık.
Yürütme izinleri eklemek için şunları yapmanız gerekir:
sudo + x script.sh
BIN = "betiklerin bulunduğu klasör" PATH = "$ BIN $ PATH"
2. Bir komut dosyasının yapısı
- Başlık
- Global değişkenlerin tanımı
- yardım
- fonksiyonlar
- Ana gövde
Başlık, hangi kabuğu kullanmak istediğimizi ve kodlamayı belirttiğimiz yerdir. Fonksiyonların avantajı, sadece bir kez yazarak tekrarlanan kodu yeniden kullanmak ve betiği anlamayı kolaylaştırmaktır, 100 satırı aşan kodlar için çok kullanışlıdır.
Fonksiyonları kullanmak için, betiğimizin ana gövdesinden önce ile tanımlanmaları gerekir. Ve eğer değişkenleri hem ana gövdede hem de fonksiyonlarda tüm komut dosyamızın global seviyesinde kullanmak istiyorsak, onları her şeyin başında, başlıktan hemen sonra tanımlamalıyız.
Son olarak, betiğimizin kötü veya kötü parametrelerle çalıştığı durumlar için bir yardımcı işlev yazmak iyi bir uygulamadır. Açıkçası, bu gibi durumlarda, fonksiyonları okumadan komut dosyasından hemen çıkmak istiyoruz. Bunun için kullanabiliriz:
function help () {echo "" "İyi biçimlendirilmiş yardım metnimiz." "" [[-z $ 1 || 1 $ == "-h" || $ 1 == "--help"]]; o zaman fi'ye yardım et
Yardım işlevine "çıkış" eklersek, her yardım çalıştırdığımızda, örneğin hata mesajlarından sonra, komut dosyasından çıkacağız. Birkaç satır kod kaydediyoruz.
Koşul, komut dosyası parametreler olmadan çalıştırılırsa veya -h / –help belirtilirse ekranda yardım göstermeyi ve çıkmayı gösterir. Bakarsanız, bu çoğu linux programının standart davranışıdır.
3. Ekrana yazdır
Bash'de ekrana yazdırmak için 2 ana komut vardır: «kaçırmak»Y«printf«. İkisi de aynı hızda ve her ikisi de bash'ın bir parçası. Yeni başlayanlar için temel fark, echo'nun sonuna bir satırsonu eklemesi, «printf"Değil.
Yankı çok iyidir ve çoğu insanın kullandığı şeydir, ancak kullanıcının GİRİŞİNİ okurken veya kelime işlemle dosyalardan alınan değişkenleri yazdırmak istediğinizde garip şeyler olabilir. Çift tırnak işaretlerini tek veya tam tersi olarak değiştirmek veya değişken referansları alıntılardan çıkarmak kadar kolay, genellikle kolayca çözülürler. «Echo»Nasıl derlendiğine bağlı olarak tuhaf şeyler yapar, her zaman Ubuntu veya her zaman Fedora kullanırsak, bu bizi etkilemez, ancak dağıtımı değiştirirsek etkilenir.
Bu yüzden kullanıyorum «printf«, Bana baş ağrısı vermeyen ve daha çok davranan«printf»C'den veya«baskı»Python için, komut dosyanızı başka bir programlama diline taşımak istiyorsanız bu çok önemlidir.
4. Kullanıcı GİRİŞİNİ okuyun
Komut dosyamızın adından sonra ve ENTER tuşuna basmadan önce yazdığımız her şey otomatik olarak özel değişkenlere kaydedilir. Bu değişkenler, X'in bir sayı olduğu $ X türündedir.
«$0»Senaryomuzun adını gösterir ve«$1»Daha sonra yazdığımız her şey sonsuza kadar değişkendir. Örneğin:
cat << EOF >> test.sh #! / bin / bash # - * - KODLAMA: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n" EOF chmod + x script.sh ./script.sh dosyam.txt
Bir test betiği oluşturuyoruz, çalıştırılabilir hale getiriyoruz ve 2 parametre ile çalıştırıyoruz. Aşağıdakilerin ekran çıktısını elde ederiz:
$ 0 = ./script.sh $ 1 = $ 2 = dosyam.txt
Tırnak işaretlerini kullanarak "dosyam.txt" yi "$ 1" e geçirebilirdik.
Ayrıca, doğrudan parametreyi kaydetmek istediğimiz değişkeni gösteren "oku" komutu ile bir kullanıcının GİRİŞİNİ okuyabiliriz. Örneğin:
printf "Adınız nedir? \ n" NAME printf okuyun "Merhaba, $ NAME. \ n"
5. Bash'de Hesaplamalar
Bunun için "kullanabiliriz"İfade«, Karmaşık hesaplamalar yapmamız gerekmediği sürece. İki şeye dikkat edilmelidir, birincisi şu «İfade»Yalnızca tam sayıları kabul eder, ikincisi, bölümün tüm sonucu döndürmesidir, geri kalanını kullanabileceğimizi görmek için«%".
Genellikle ifadenin sonucunu bir değişkene atamak isteriz. Bunu iki şekilde yapabiliriz:
VAR2 = "ifade $ VAR1 / 10` VAR2 = $ (VAR1 / 100 $ ifade)
Ayrıca «İfade»Çift parantez kullanarak:
VAR2 = $ ((VAR1 $ / 100))
6. şartlar
Şimdiden çok kapsamlı bir şekilde yazılmıştır: «if""başka""elif»Ve koşullar. Bunu şurada okuyabilirsiniz:
- Bash'de Programlama: Kısım 1
- Bash: eğer öyleyse, başka koşullar
- Bir dosya veya klasörün var olup olmadığını ve bir if döngüsü ile daha fazlasını kontrol edin
- Bash'de Programlama: Kısım 2
Basit köşeli parantezlerin kullanımı arasındaki farkı vurgulamak istiyorum, «[]«, Ve çift parantez,«[[]]«, Koşullar için. Çift parantez ile ek koşullar kullanabiliriz:
- «&&"İçin ve
- «||»İçin veya
Kullanmak "&&»Y«||»Basit köşeli parantezlerle her parça ayrı köşeli parantez içinde ayrılmalıdır. Komut dosyasının yardımın çalıştırılması gerekip gerekmediğini görmek için kullanılan örnek şu şekilde olacaktır:
eğer [-z "$ 1"] || ["1 $" == "-h"] || ["$ 1" == "--help"]]; o zaman fi'ye yardım et
Ayrıca hataları önlemek için değişken adlarını tırnak içine almak zorunda kalmamızı sağlar. Örneğin:
[1 $ = 1] ise; sonra printf "Parametre 1'e eşittir."; fi eğer ["1 $" = 1]; sonra printf "Parametre 1'e eşittir."; fi eğer [[1 $ = 1]]; sonra printf "Parametre 1'e eşittir."; fi
Script.sh herhangi bir parametre olmadan çalıştırılırsa, ilk durum bir hata verecektir:
bash: [: =: tekli operatör bekleniyor
Hakkında konuşulmayan şey şu: «dava«, Basitleştirmek için kullanılan«if«. Baştan başlayalım, elimizde hiç olmadığında «if»Tüm kod çalıştırılacaktır. Bir koşul eklersek «if»Birinde kod bloğunun bulunduğu iki durumumuz olacak.if»Ve bu bloğun yürütülmediği diğer durum.
Bir «eklersekbaşka«Bizim de iki vakamız olacak ama bu iki vaka öncekilerden farklı. Çünkü şimdi iki koşullu kod bloğu, A ve B ve programın geri kalanı olan bir C bloğu olacak. A veya B yürütülecektir ve C. Önceki durumda A ve C veya yalnızca C idi.
Yazma koşullarından kaçınmak için «eğer / değilse"içinde"başka»Ve kodun okunmasını basitleştirmek için yaratıldı«elif«. Bir öncekine bağlı birçok koşulumuz olduğunda, örneğin sayı aralığı veya tür:
VAR1 = 1 $, eğer [[$ VAR1 = 1]]; sonra printf "1 \ n" elif [[$ VAR1 = 2]]; sonra printf "2 \ n" elif [[$ VAR1 = 3]]; sonra printf "3 \ n" else printf "yok \ n" fi
Son durumda «elif»Birçok koşul okunacaktır. Durumla birlikte bu süreç kolaylaştırılmıştır:
VAR1 = 1 $ durumda $ VAR in 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 veya 4, değişir \ n" ;; *) printf "yok \ n" ;; bu C
Bir değişken, bu durumda VAR1 okunacak ve herhangi bir durumla eşdeğer olup olmadığı kontrol edilecek, değilse, varsayılan durum "*" çalıştırılacaktır. Çift noktalı virgül, «kırılma", Onlar söyler"dava»Bu sona ermeli.
7. Döngüler
Herhangi bir programlama dilinde çok az döngü bilinmektedir. Bash'de bunlar «süre""kadar»Y«için«. Blogda bunlarla ilgili zaten yazılmıştır:
İki tür döngü vardır «için«, Tipte olanlar«$ LOQUESEA'da VAR için»Ve C tipi olanlar«$ for ((I = 0; I <= 10; I ++))«. İkinci tür döngüler «için»Çok kullanışlıdır, döngünün başında 3 bölümden oluşur:
- Değişkenlerin bildirilmesi ve başlatılması (Bu durumda bir yardımcı değişken "I = 0").
- Yürütme koşulu (10'dan küçük veya XNUMX'a eşit olana kadar).
- Yardımcı değişkenin artışı
Bence bu, en güçlü döngüdür. 0'dan 10'a kadar tüm sayıları yazdıran bir örnek:
#! / bin / bash için ((I = 0; I <= 10; I ++)); yazdır "$ I \ n" bitti
8. İşlevler
Bash'in yapmamıza izin vermediği bazı şeyler var, değil mi? İlk bakışta, bash işlevleri 3 şeyi yapmanızı engeller: işlevlerde yerel değişkenleri bildirmek, parametreleri işlevlere geçirmek ve parametreleri döndürmek. Her şeyin bir çözümü vardır.
Şunun gibi bir şey yapma:
#! / bin / bash VAR = 1 printc "$ VAR \ n" işlevi merhaba () {VAR = 2 printf "$ VAR \ n"} merhaba printf "$ VAR \ n"
Bu, ekran 1, 2 ve 2'ye yazdırır.
Yerel değişkenleri bildirmek için «ekleyinyerel»Bildirirken:
#! / bin / bash VAR = 1 printf "$ VAR1 \ n" function foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Bu, ekrana 1, 1, 2, 1 yazdırır.
Parametreleri bir işleve nasıl aktarırsınız?
#! / bin / bash # - * - KODLAMA: UTF-8 - * - function merhaba () {printf "Merhaba $ 1 \ n"}
printf "Adınız nedir? \ n"
VAR1'i oku
merhaba $ VAR1
Parametreler nasıl döndürülür?
#! / bin / bash # - * - KODLAMA: UTF-8 - * - function merhaba () {printf "Merhaba holita"} printf "Adınız nedir? \ n" VAR1 VAR1 = $ (merhaba) okuyun printf "$ VAR1 $ VAR2 \ n"
Gördüğünüz gibi, bunun iki dezavantajı var, sadece bir parametre döndürebilirsiniz, bu bir vektör 😀 olabilir ve bir parametre döndürmek isterseniz, artık o fonksiyondan ekrana yazdıramazsınız.
9. Getoplar
Karmaşık komut dosyaları oluşturmak için Bash hakkında bilmeniz gereken son şeylerden biri «Getops«. Sırasına bakılmaksızın seçenekleri komut dosyasına aktarmak için kullanılır. Tek dezavantajı, yalnızca kısa seçenekleri etkilemesidir:
#! / bin / bash # - * - KODLAMA: UTF-8 - * - VARC = 0 fonksiyon yardım () {printf "Yardım mesajı \ n" çıkış} if [[-z $ 1]]; sonra getopts yaparken fi'ye yardım edin: ha: b: c OPT; $ OPT durumu h) yardım ;; :) Yardım ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Yardım ;; esac done # VARA, VARB ve VARC ile işler # yapan komut dosyasının ana bloğu
«Getopt'lar»Seçenekleri tek tek okur, bu nedenle bir döngü gereklidir.
«Kullanılarak geçilebilecek 2 tür seçenek vardırGetopts":
- Bu durumda -c veya -h olarak bayrak adı verilen parametreler. Kullanmak istediğimiz harf ile belirtilirler. Boole değişkenleri gibiler, «gerçek»(Are) veya«yanlış"(Burada değiller).
- İlişkili bağımsız değişkenlere sahip parametreler, -bir şey, -b herhangi bir şey. Aşağıda iki nokta üst üste ile istediğimiz harf ile belirtilirler. Argüman OPTARG'da saklanır (bu isim değiştirilemez).
Bu komut dosyası ne yapıyor?
Hiçbir seçenek geçilmediğinde, "-h" parametresi geçildiğinde, geçersiz bir parametre geçildiğinde (örneğin "-x", bu "\?" İle yapılır) veya "\?" İle yapılırsa yardım mesajını görüntüler. bağımsız değişken (":"). Geri kalan durumlarda, "-c" nin varlığını VARC'de 1 olarak ve VARA ve VARB'de "-a" ve "-b" ile geçen değerleri kaydeder.
MASTERLY. Daha fazla U_U demiyorum
Merhaba çok güzel yazı.
Hey, chmod + x yerine sudo + x izinlerini verdin
$ sudo chmod + x script.sh
(Daha kesin olmak gerekirse, hehe)
Ah, tebrikler ve teşekkürler!
Çok güzel gönderi, gerçek şu ki seni tebrik ediyorum, devam et selamlar
Ve komut dosyasının çalıştırıldığında görünür olmasını, adım adım, örneğin değişkenlerin, koşulların ve her şeyin nasıl davrandığını görmek istiyorsanız, şunu kullanabilirsiniz:
sh -x betiği
selamlar
BİR PARÇA vesayet. Mükemmel ve çok iyi açıklanmış.
Teşekkür ederim.
Konuyla ilgili mükemmel gönderi 😉
Çok ilginç ve önemli, bilgi için teşekkürler….
ŞEREFLER !!!
Miguel komutuna gelince, tebrikleriniz için hepinize teşekkür ederim, yayınlandıktan sonra girişi değiştirmeme izin vermiyor. Sanırım elav yapmak zorunda kalacak.
Çok iyi!
Her şeyden önce sizi gönderi için tebrik etmek istedim, anlamayı kolay buldum ve özellikle programlamaya yeni başlayanlar için, bash'ta iyi programlama yapmak için yönergeleri takip etmenin gerçekten yardımcı olduğunu düşünüyorum.
Ancak düzeltilmesi gerektiğini düşündüğüm birkaç ayrıntı buldum.
Birincisi: «2. BİR YAZININ YAPISI »işlev kapatılmaz ve bu, bir komut dosyası içinde yürütülürken sorunlara neden olur.
Çözüm, "çıkış" komutunun hemen arkasına bir kapatma ayracı eklemektir.
İkincisi: «4. KULLANICI GİRİŞİNİ OKUYUN ”, kullanıcının $ 0 ile sonsuz arasında girebileceği parametrelerin olduğunu onaylarsınız, ancak," bash "yalnızca $ 0 ile $ 9 arasında yorumlayacaktır, çünkü $ 10, $ 1 + 0'a eşit olacaktır.
Bu sorunu çözmek için, aşağıdaki değişkenleri almak için "shift" komutunu kullanabilirsiniz. Veya değişkeni kaşlı ayraçlar içinde "$ {10}" belirtin, böylece bash değerleri $ 1 + 0 olarak değil birlikte alır.
Daha fazla uzatmadan selamlar!
Yorumun için teşekkürler. Çıkışın hem komut dosyasında hem de işlevlerde doğru kullanımını açıklayamadı. {10} $ 'a gelince, hiç bu kadar miras bırakmadım, bu yüzden bu problemle karşılaşmadım, bunun için bir çözüm olduğunu bilmek güzel (bugün öğrendiğim yeni şeyin üstünü zaten çizdim 😀).
Yazı için çok teşekkür ederim! Bahsettiğiniz bazı şeyler hala açıklığa kavuşturulmamıştı. Örneğin, getoplar.
Ekran çıktıları kısmında, daha sonra bahsettiğiniz kediden bahsetmeniz gerekiyordu ...
kedi <
***************************************
* BU FORM ÇOK AÇIKLIDIR *
***************************************
EOF
Örneğinizde:
kedi << EOF >> test.sh
İki şeyden bahsedilmelidir ... >> bu 'append' yani aynı komutu tekrar ederseniz, tüm betiğin kopyası olacak ... Sadece bir tane kullanmalısınız ...
cat << EOF> script.sh
Evet, script.sh olarak da adlandırılmalıdır.
Daha sonra
eğer [-z "$ 1"] || ["1 $" == "-h"] || ["$ 1" == "–help"]]; sonra
yardım et
fi
Yazılması gerektiğini düşünüyorum ...
eğer [[-z "$ 1"] || ["1 $" == "-h"] || ["$ 1" == "–help"]]; sonra
...
BASH'dan keşfedilecek çok şey var.
"TEMELLER" adını verebilir misiniz? 🙂
Örneğin, 'testçiler' parametresi boş olup olmadıklarını görmek için -z veya bir dosya olarak var olup olmadığını görmek için -f gibi.
Çabanız için tekrar teşekkürler.
alberto
Çok iyi bir bash betiği öğreticisi!
-- KODLAMA: UTF-8 --
Bir bash betiğinde karakter kodlamasını ayarlamak için bu satırı ilk kez gördüm. Bana Bash'ten çok Python'a benziyor. Gerçekten gerekli mi? Google'da bir referans aradım ama hiçbir şey bulamıyorum, elinizde bu konuyu anlatan bir bağlantı var mı? Özellikle bu hattın uygunluğu üzerine.
Bence, UTF-8 kullanarak Bash'de komut dosyaları yazmak için, yalnızca metin dosyasını olduğu gibi (BOM olmadan) kaydetmeniz ve belirli ortam değişkenlerini (LANG ve LC_ *) doğru şekilde ayarlamanız gerekir.
Daha sonra, açıkça, yürütülen komutların ASCII dışındaki kodlamalar için hazırlanması gerekir. Örneğin, büyük harfe gitmek istersek, bu işe yaramıyor gibi görünüyor:
«Echo áéíóú | tr az AZ »
o:
«Echo áéíóú | tr [: alt:] [: üst:] »
ve kullanmak daha iyidir:
«Echo áéíóú | awk '{baskı toupper ($ 0)}' ».
Hakkında "kodlama»Bu blogda daha önce bahsedilmişti:
Bash: bir komut dosyası nasıl yürütülebilir yapılır
Yükleme sonrası yardımcı program komut dosyası
Biri beni düzeltir, ancak bu kodlama satırı (# -- KODLAMA: UTF-8 --) bash veya kabuk ile ilgisi yoktur: bir yorum satırıdır (# ile başlar) ve DÜZENLEYİCİYE komut dosyasını yazmak için kullandığımızı (vim, emacs ...) dosyanın kodlamasını bildirmeye yarar.
Aslında bash bir yorum satırı olduğu için böyle bir satır görmüyor.
Mükemmel öğretici, Sysadmin'in Bash'te Komut Dosyası Yazmayı bilmesi çok önemli olduğundan, her şey için yararlıdır.
Çok çok iyi!
Selamlar!
Herhangi biri için yararlı olması durumunda, kendi Komut dosyalarınızı oluşturmak için birkaç kullanım ve örnek aşağıda verilmiştir: https://github.com/reduardo7/hsabx
Çok iyi. Komut dosyalarıma eklenecek yeni şeyler. Coddig şeyinde ve printf şeyinde yoktu.
Teşekkür ederim!!!
Sooo iyi makale! Bunu favoriler için saklıyorum, yanlış olanı düzeltmek ve hatta daha fazla içerikle genişletmek güzel olurdu. Tüm bu bilgiler için bir alkış !!!!