Menü
Bedava
kayıt
ev  /  Gezginler/ Windows'ta bir komut dosyası aracılığıyla ubuntu'yu kontrol edin. Bilgisayar başlangıcında kendi otomatik çalıştırma komut dosyanızı oluşturma

Windows'ta bir komut dosyası aracılığıyla ubuntu'yu kontrol etme. Bilgisayar başlangıcında kendi otomatik çalıştırma komut dosyanızı oluşturma

Bugün bash betikleri hakkında konuşacağız. Bunlar, bash kabuğu için yazılmış komut satırı komut dosyalarıdır. zsh, tcsh, ksh gibi başka kabuklar da var ama biz bash'a odaklanacağız. Bu materyal herkes için tasarlanmıştır, tek koşul Linux komut satırında çalışma yeteneğidir.



Komut satırı komut dosyaları, klavyeden girilebilen, dosyalar halinde bir araya getirilen ve bazı ortak amaçlarla birleştirilebilen aynı komutların koleksiyonlarıdır. Bu durumda, ekiplerin çalışmalarının sonuçları ya bağımsız değere sahip olabilir ya da diğer ekipler için girdi verileri olarak hizmet edebilir. Komut dosyası oluşturma, sık gerçekleştirilen eylemleri otomatikleştirmenin güçlü bir yoludur.

Bu nedenle, komut satırı hakkında konuşursak, noktalı virgülle ayırarak girerek aynı anda birkaç komutu yürütmenize izin verir:

şifre; ben kimim
Aslında, terminalinizde denediyseniz, iki komut içeren ilk bash betiğiniz zaten yazılmıştır. Bu şekilde çalışır. İlk olarak, pwd komutu mevcut çalışma dizini hakkındaki bilgileri görüntüler, ardından whoami komutu, oturum açtığınız kullanıcı hakkında bilgileri görüntüler.

Bu yaklaşımı kullanarak, bir satırda istediğiniz kadar komutu birleştirebilirsiniz, sınırlama yalnızca programa iletilebilecek maksimum argüman sayısındadır. Aşağıdaki komutu kullanarak bu sınırlamayı belirleyebilirsiniz:

Getconf ARG_MAX
Komut satırı harika bir araçtır, ancak her ihtiyacınız olduğunda komutları girmeniz gerekir. Bir dosyaya bir sürü komut yazarsanız ve bunları yürütmek için o dosyayı çağırırsanız ne olur? Aslında bahsettiğimiz dosyaya komut satırı betiği denir.

Bash betikleri nasıl çalışır?

Dokunma komutunu kullanarak boş bir dosya oluşturun. İlk satırında hangi kabuğu kullanacağımızı belirtmemiz gerekiyor. Bash ile ilgileniyoruz, bu nedenle dosyanın ilk satırı şöyle olacak:

#! / bin / bash
Bu dosyanın diğer satırlarında, kabuğun işlemediği yorumları belirtmek için hash karakteri kullanılır. Bununla birlikte, ilk satır özel bir durumdur, burada bir hash ve ardından bir ünlem işareti (bu diziye Shebang denir) ve bash yolu sisteme betiğin bash için yazıldığını gösterir.

Kabuk komutları satır beslemeleriyle, yorumlar ise karma işaretleriyle sınırlandırılır. İşte böyle görünüyor:

#! / bin / bash # Bu bir yorumdur pwd whoami
Burada, komut satırında olduğu gibi, noktalı virgülle ayırarak tek satırda komutlar yazabilirsiniz. Ancak komutları ayrı satırlara yazmak dosyanın okunmasını kolaylaştırır. Her durumda, kabuk onları işleyecektir.

Komut dosyası izinlerini ayarlama

Dosyayı myscript adıyla kaydedin ve neredeyse bash betiğini oluşturmayı bitirdiniz. Şimdi geriye kalan tek şey bu dosyayı çalıştırılabilir hale getirmek, aksi takdirde çalıştırmaya çalışırken İzin reddedildi hatasıyla karşılaşacaksınız.


Yanlış yapılandırılmış izinlere sahip bir komut dosyası çalıştırmaya çalışmak

Dosyayı çalıştırılabilir hale getirelim:

Chmod + x ./myscript
Şimdi yürütmeye çalışalım:

./benim komut dosyası
İzinleri ayarladıktan sonra her şey olması gerektiği gibi çalışıyor.


Bash betiği başarıyla çalıştırılıyor

Mesajları görüntüleme

Eko komutu, metni Linux konsoluna çıkarmak için kullanılır. Bu gerçeğin bilgisinden yararlanalım ve komut dosyamızı düzenleyelim, zaten içinde bulunan komutlar tarafından görüntülenen verilere açıklamalar ekleyerek:

#! / bin / bash # yorumumuz burada echo "Geçerli dizin:" pwd echo "Giriş yapan kullanıcı:" whoami
Güncellenmiş komut dosyasını çalıştırdıktan sonra olan budur.


Bir komut dosyasından mesajları görüntüleme

Artık echo komutunu kullanarak açıklayıcı notlar yazdırabiliriz. Linux araçlarını kullanarak bir dosyayı nasıl düzenleyeceğinizi bilmiyorsanız veya daha önce echo komutunu görmediyseniz, bu kaynağa bir göz atın.

Değişkenleri Kullanma

Değişkenler, örneğin diğer komutlar tarafından kullanılacak komutların sonuçları gibi bilgileri bir komut dosyasında saklamanıza izin verir.

Çalışmalarının sonuçlarını kaydetmeden tek tek komutları yürütmekte yanlış bir şey yoktur, ancak bu yaklaşımın olanakları çok sınırlıdır.

Bash betiklerinde kullanılabilecek iki tür değişken vardır:

  • Ortam Değişkenleri
  • Kullanıcı değişkenleri

Ortam Değişkenleri

Bazen kabuk komutlarının bazı sistem verileriyle çalışması gerekir. Örneğin, geçerli kullanıcının ana dizinini şu şekilde listeleyebilirsiniz:

#! / bin / bash # kullanıcı ana sayfasını görüntüle echo "Geçerli kullanıcının evi: $ HOME"
Lütfen $ HOME sistem değişkenini çift tırnak içinde kullanabileceğimizi unutmayın, bu sistemin onu tanımasını engellemeyecektir. Yukarıdaki betiği çalıştırırsanız olan budur.


Bir komut dosyasında bir ortam değişkeni kullanma

Ekranda dolar işareti görmek isterseniz ne olur? Hadi bunu deneyelim:

Echo "Cebimde 1 dolarım var"
Sistem, alıntılanan dizedeki dolar işaretini algılar ve bir değişkene başvurduğumuzu düşünür. Komut dosyası, tanımsız $ 1 değişkeninin değerini görüntülemeye çalışacaktır. İstediğimiz bu değil. Ne yapalım?

Dolar işaretinden önceki ters eğik çizgi kaçış karakteri bu durumda yardımcı olabilir:

Echo "Cebimde \ 1$ var"
Komut dosyası şimdi tam olarak bekleneni verecektir.


Dolar İşareti Çıktısı Almak İçin Bir Kaçış Dizisi Kullanma

Kullanıcı değişkenleri

Ortam değişkenlerine ek olarak, bash komut dosyaları, komut dosyasında kendi değişkenlerinizi ayarlamanıza ve kullanmanıza olanak tanır. Bu değişkenler, betik yürütmeyi bitirene kadar değerlerini korur.

Sistem değişkenlerinde olduğu gibi, kullanıcı değişkenlerine dolar işareti kullanılarak erişilebilir:
TNW-CUS-FMP - hizmetlerimizde %10 indirim için promosyon kodu, 7 gün içinde etkinleştirilmeye hazır
#! / bin / bash # değişkenleri test etme notu = 5 kişi = "Adam" echo "$ kişi iyi bir çocuk, $ sınıfında"
Böyle bir betiği çalıştırdıktan sonra olan budur.


Bir komut dosyasındaki özel değişkenler

Komut değiştirme

Bash betiklerinin en kullanışlı özelliklerinden biri, komutların çıktısından bilgi çıkarma ve onu değişkenlere atama yeteneğidir, bu da bu bilgilerin betik dosyasında herhangi bir yerde kullanılmasına izin verir.

Bu iki şekilde yapılabilir.

  • Geri tik ile ""
  • $ () kullanarak
İlk yaklaşımı kullanarak, backtick yerine tek bir alıntı kullanmadığınızdan emin olun. Komut, bu tür iki simgeye dahil edilmelidir:

Mydir = `pwd`
İkinci yaklaşımda, aynı şey şöyle yazılır:

Mydir = $ (pwd)
Ve senaryo sonunda şöyle görünebilir:

#! / bin / bash mydir = $ (pwd) echo $ mydir
İşlemi sırasında, pwd komutunun çıktısı, içeriği echo komutunu kullanarak konsola gidecek olan mydir değişkenine kaydedilecektir.


Bir komutun sonuçlarını bir değişkende saklayan bir komut dosyası

matematiksel işlemler

Bir komut dosyasında matematiksel işlemler gerçekleştirmek için $ ((a + b) gibi bir yapı kullanabilirsiniz):

#! / bin / bash var1 = $ ((5 + 5)) echo $ var1 var2 = $ (($ var1 * 2)) echo $ var2


Bir komut dosyasındaki matematik işlemleri

If-then kontrol yapısı

Bazı senaryolar, komut yürütme akışının kontrolünü gerektirir. Örneğin, bir değer beşten büyükse, bir eylem gerçekleştirmeniz gerekir, aksi takdirde - başka. Bu pek çok durumda geçerlidir ve if-then kontrol yapısı burada bize yardımcı olacaktır. En basit haliyle, şöyle görünür:

Eğer o zaman fi komutlarını komutla
Ve işte çalışan bir örnek:

#! / bin / bash eğer pwd ise yankı "Çalışıyor" fi
Bu durumda pwd komutu başarılı bir şekilde tamamlanırsa konsolda "çalışıyor" yazısı görüntülenecektir.

Bilgimizi kullanalım ve daha karmaşık bir senaryo yazalım. Diyelim ki / etc / passwd'de belirli bir kullanıcı bulmanız gerekiyor ve onu bulabilirseniz var olduğunu bildirin.

#! / bin / bash user = likegeeks eğer grep $ user / etc / passwd ise echo "$ kullanıcısı Var" fi
Bu betiği çalıştırdıktan sonra olan budur.


Kullanıcı ara

Burada / etc / passwd dosyasında kullanıcıyı bulmak için grep komutunu kullandık. Grep komutuna aşina değilseniz, açıklamasını bulabilirsiniz.

Bu örnekte, bir kullanıcı bulunursa, komut dosyası uygun bir mesaj görüntüler. Kullanıcı bulunamazsa ne olur? Bu durumda, komut dosyası bize hiçbir şey söylemeden yürütmesini sonlandıracaktır. Bize bundan da bahsetmesini istiyorum, bu yüzden kodu iyileştireceğiz.

If-then-else kontrol yapısı

Programın hem başarılı bir aramanın sonuçlarını hem de bir başarısızlığı raporlayabilmesi için if-then-else yapısını kullanacağız. İşte nasıl çalıştığı:

komut ise, else fi komutlarını komutlar
İlk komut sıfır döndürürse, yani başarılı bir şekilde yürütülürse, koşul doğru olur ve yürütme else dalını takip etmez. Aksi takdirde, sıfırdan farklı bir şey döndürülürse, bu, başarısızlık veya yanlış bir sonuç anlamına gelir, else'den sonraki komutlar yürütülür.

Şöyle bir script yazalım:

#! / bin / bash user = başka bir Kullanıcı ise grep $ user / etc / passwd ise echo "$ kullanıcısı Var" else echo "$ kullanıcısı mevcut değil" fi
İnfazı, else şubesi boyunca devam etti.


If-then-else yapısıyla bir komut dosyası çalıştırma

Pekala, devam edelim ve kendimize daha zor koşulları soralım. Ya birden fazla koşulu kontrol etmeniz gerekiyorsa, ancak birkaçını kontrol etmeniz gerekiyorsa? Örneğin, istenen kullanıcı bulunursa, başka bir koşul karşılanırsa bir mesaj görüntülemeniz gerekir - başka bir mesaj vb. Böyle bir durumda iç içe koşullar bize yardımcı olacaktır. Şuna benziyor:

Komut1 ise elif komut2'yi, ardından fi komutlarını verir.
İlk komut, başarılı yürütüldüğünü gösteren sıfır döndürürse, ilk sonra bloğundaki komutlar yürütülür, aksi takdirde, ilk koşul yanlış çıkarsa ve ikinci komut sıfıra dönerse, ikinci kod bloğu yürütülür. idam edilecek.

#! / bin / bash user = başka bir Kullanıcı ise grep $ user / etc / passwd ise yankı "$ user Var" elif ls / home sonra echo "Kullanıcı yok ama yine de / home altında bir dizin var" fi
Böyle bir komut dosyasında, örneğin, arama herhangi bir sonuç döndürmediyse useradd komutunu kullanarak yeni bir kullanıcı oluşturabilir veya başka yararlı bir şey yapabilirsiniz.

Rakamları karşılaştırma

Betiklerde sayısal değerler karşılaştırılabilir. Aşağıda ilgili komutların bir listesi bulunmaktadır.
n1 -eq n2 n1, n2'ye eşitse true döndürür.
n1 -ge n2 n1, n2'den büyük veya ona eşitse true döndürür.
n1 -gt n2 n1, n2'den büyükse true döndürür.
n1 -le n2 n1, n2'den küçük veya ona eşitse true döndürür.
n1 -lt n2 n1, n2'den küçükse true döndürür.
n1 -ne n2 n1, n2'ye eşit değilse true değerini döndürür.

Örnek olarak karşılaştırma operatörlerinden birini deneyelim. İfadenin köşeli parantez içine alındığına dikkat edin.

#! / bin / bash val1 = 6 ise [$ val1 -gt 5] ise echo "$ val1 test değeri 5'ten büyük" aksi takdirde echo "$ val1 test değeri 5'ten büyük değil" fi
Bu komutun çıktısı budur.


Komut dosyalarındaki sayıları karşılaştırma

val1 değişkeninin değeri 5'ten büyüktür, sonuç olarak, karşılaştırma operatörünün o zaman dalı yürütülür ve konsolda karşılık gelen bir mesaj görüntülenir.

Dize karşılaştırması

Ayrıca scriptlerdeki string değerlerini de karşılaştırabilirsiniz. Karşılaştırma operatörleri oldukça basit görünüyor, ancak dizi karşılaştırma işlemlerinin aşağıda değineceğimiz belirli özellikleri var. İşte operatörlerin bir listesi.
str1 = str2 Dizeleri eşitlik açısından test eder, dizeler aynıysa true değerini döndürür.
s tr1! = str2 Dizeler aynı değilse true değerini döndürür.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1> str2 str1 str2'den büyükse true değerini döndürür.
-n str1 str1 sıfırdan büyükse true değerini döndürür.
-z str1 str1'in uzunluğu sıfır ise true değerini döndürür.

İşte bir komut dosyasındaki dizeleri karşılaştırmaya bir örnek:

#! / bin / bash user = "likegeeks" eğer [$ user = $ USER] ise echo "$ user şu anda oturum açmış olan kullanıcıdır" fi
Komut dosyasının yürütülmesinin bir sonucu olarak aşağıdakileri elde ederiz.


Komut dizilerinde dizeleri karşılaştırma

İşte dize karşılaştırmanın bahsetmeye değer bir özelliği. Yani, ">" ve " operatörleri<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>"Bir çıktı yönlendirme komutu olarak.

Bu operatörlerle çalışmak kodda şöyle görünür:

#! / bin / bash val1 = metin val2 = [$ val1 \> ise "başka bir metin"
İşte senaryonun sonuçları.


Dizelerin karşılaştırılması, verilen uyarı

Komut dosyasının yürütülmesine rağmen bir uyarı oluşturduğunu unutmayın:

./myscript: satır 5: [: çok fazla argüman var
Bu uyarıdan kurtulmak için $ val2'yi çift tırnak içine alın:

#! / bin / bash val1 = text val2 = "başka bir metin" eğer [$ val1 \> "$ val2"] ise yankı "$ val1 $ val2'den büyük" değilse echo "$ val1 $ val2'den küçük" fi
Şimdi her şey olması gerektiği gibi çalışıyor.


Dize karşılaştırması

">" ve " operatörlerinin bir başka özelliği<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

likegeeks likegeeks
Dosyam adını vererek kaydedelim ve ardından terminalde aşağıdaki komutu çalıştıralım:

Dosyamı sırala
Dosyadaki satırları şu şekilde sıralayacaktır:

Beğenenler
Sıralama komutu varsayılan olarak satırları artan düzende sıralar, yani örneğimizdeki küçük harf büyük harften daha küçüktür. Şimdi aynı stringleri karşılaştıracak bir script hazırlayalım:

#! / bin / bash val1 = Likegeeks val2 = likegeeks eğer [$ val1 \> $ val2] ise echo "$ val1 $ val2'den büyük" değilse echo "$ val1 $ val2'den küçük" fi
Çalıştırırsanız, bunun tersinin doğru olduğu ortaya çıkıyor - küçük harf artık büyük harften daha büyük.


Bir komut dosyasında sıralama komutu ve satır karşılaştırması

Karşılaştırma komutlarında daha az büyük harf bulunur. Buradaki dize karşılaştırması, ASCII karakter kodlarını karşılaştırarak yapılır, sıralama düzeni bu nedenle karakter kodlarına bağlıdır.

Sıralama komutu, sistem dili ayarlarında belirtilen sıralama düzenini kullanır.

Dosya kontrolleri

Aşağıdaki komutlar muhtemelen bash betiklerinde en sık kullanılanlardır. Dosyalarla ilgili çeşitli koşulları kontrol etmenizi sağlar. İşte bu komutların bir listesi.
-d dosyası Bir dosyanın var olup olmadığını ve bir dizin olup olmadığını kontrol eder.
-e dosya Dosyanın var olup olmadığını kontrol eder.
-f dosyası Dosyanın var olup olmadığını ve bir dosya olup olmadığını kontrol eder.
-r dosyası Dosyanın var olup olmadığını ve okunabilir olup olmadığını kontrol eder.
-s dosyası Dosyanın var olup olmadığını ve boş olmadığını kontrol edin.
-w file Dosyanın var olup olmadığını ve yazılabilir olup olmadığını kontrol eder.
-x dosyası Dosyanın var olup olmadığını ve yürütülebilir olup olmadığını kontrol eder.
dosya1 -nt dosya2 dosya1'in dosya2'den daha yeni olup olmadığını kontrol eder.
dosya1 -ot dosya2 dosya1'in dosya2'den daha eski olup olmadığını kontrol eder.
-O dosyası Dosyanın mevcut olup olmadığını ve mevcut kullanıcıya ait olup olmadığını kontrol eder.
-G dosyası Dosyanın var olup olmadığını ve grup kimliğinin mevcut kullanıcının grup kimliğiyle eşleşip eşleşmediğini kontrol eder.

Bu komutların yanı sıra bugün tartışılan diğer birçok komutun hatırlanması kolaydır. İsimleri, çeşitli kelimelerin kısaltmaları olup, yaptıkları kontrolleri doğrudan gösterir.

Pratikte komutlardan birini deneyelim:

#! / bin / bash mydir = / home / likegeeks eğer [-d $ mydir] ise echo "$ mydir dizini mevcut" cd $ mydir ls else echo "$ mydir dizini mevcut değil" fi
Bu komut dosyası, mevcut bir dizin için içeriğini görüntüler.


Bir dizinin içeriğini görüntüleme

Geri kalan komutları kendiniz deneyebileceğinize inanıyoruz, hepsi aynı şekilde uygulanıyor.

sonuçlar

Bugün, bash betikleri yazmaya nasıl başlayacağımızı ve bazı temel şeyleri ele aldık. Aslında, bash programlama konusu çok büyük. Bu makale, 11 makalelik geniş bir dizinin ilk bölümünün çevirisidir. Hemen devam etmek istiyorsanız - işte bu materyallerin orijinallerinin bir listesi. Kolaylık sağlamak için bu, az önce okuduğunuz çeviriyi içerir.

Bugün bash betikleri hakkında konuşacağız. Bunlar, bash kabuğu için yazılmış komut satırı komut dosyalarıdır. zsh, tcsh, ksh gibi başka kabuklar da var ama biz bash'a odaklanacağız. Bu materyal herkes için tasarlanmıştır, tek koşul Linux komut satırında çalışma yeteneğidir.



Komut satırı komut dosyaları, klavyeden girilebilen, dosyalar halinde bir araya getirilen ve bazı ortak amaçlarla birleştirilebilen aynı komutların koleksiyonlarıdır. Bu durumda, ekiplerin çalışmalarının sonuçları ya bağımsız değere sahip olabilir ya da diğer ekipler için girdi verileri olarak hizmet edebilir. Komut dosyası oluşturma, sık gerçekleştirilen eylemleri otomatikleştirmenin güçlü bir yoludur.

Bu nedenle, komut satırı hakkında konuşursak, noktalı virgülle ayırarak girerek aynı anda birkaç komutu yürütmenize izin verir:

şifre; ben kimim
Aslında, terminalinizde denediyseniz, iki komut içeren ilk bash betiğiniz zaten yazılmıştır. Bu şekilde çalışır. İlk olarak, pwd komutu mevcut çalışma dizini hakkındaki bilgileri görüntüler, ardından whoami komutu, oturum açtığınız kullanıcı hakkında bilgileri görüntüler.

Bu yaklaşımı kullanarak, bir satırda istediğiniz kadar komutu birleştirebilirsiniz, sınırlama yalnızca programa iletilebilecek maksimum argüman sayısındadır. Aşağıdaki komutu kullanarak bu sınırlamayı belirleyebilirsiniz:

Getconf ARG_MAX
Komut satırı harika bir araçtır, ancak her ihtiyacınız olduğunda komutları girmeniz gerekir. Bir dosyaya bir sürü komut yazarsanız ve bunları yürütmek için o dosyayı çağırırsanız ne olur? Aslında bahsettiğimiz dosyaya komut satırı betiği denir.

Bash betikleri nasıl çalışır?

Dokunma komutunu kullanarak boş bir dosya oluşturun. İlk satırında hangi kabuğu kullanacağımızı belirtmemiz gerekiyor. Bash ile ilgileniyoruz, bu nedenle dosyanın ilk satırı şöyle olacak:

#! / bin / bash
Bu dosyanın diğer satırlarında, kabuğun işlemediği yorumları belirtmek için hash karakteri kullanılır. Bununla birlikte, ilk satır özel bir durumdur, burada bir hash ve ardından bir ünlem işareti (bu diziye Shebang denir) ve bash yolu sisteme betiğin bash için yazıldığını gösterir.

Kabuk komutları satır beslemeleriyle, yorumlar ise karma işaretleriyle sınırlandırılır. İşte böyle görünüyor:

#! / bin / bash # Bu bir yorumdur pwd whoami
Burada, komut satırında olduğu gibi, noktalı virgülle ayırarak tek satırda komutlar yazabilirsiniz. Ancak komutları ayrı satırlara yazmak dosyanın okunmasını kolaylaştırır. Her durumda, kabuk onları işleyecektir.

Komut dosyası izinlerini ayarlama

Dosyayı myscript adıyla kaydedin ve neredeyse bash betiğini oluşturmayı bitirdiniz. Şimdi geriye kalan tek şey bu dosyayı çalıştırılabilir hale getirmek, aksi takdirde çalıştırmaya çalışırken İzin reddedildi hatasıyla karşılaşacaksınız.


Yanlış yapılandırılmış izinlere sahip bir komut dosyası çalıştırmaya çalışmak

Dosyayı çalıştırılabilir hale getirelim:

Chmod + x ./myscript
Şimdi yürütmeye çalışalım:

./benim komut dosyası
İzinleri ayarladıktan sonra her şey olması gerektiği gibi çalışıyor.


Bash betiği başarıyla çalıştırılıyor

Mesajları görüntüleme

Eko komutu, metni Linux konsoluna çıkarmak için kullanılır. Bu gerçeğin bilgisinden yararlanalım ve komut dosyamızı düzenleyelim, zaten içinde bulunan komutlar tarafından görüntülenen verilere açıklamalar ekleyerek:

#! / bin / bash # yorumumuz burada echo "Geçerli dizin:" pwd echo "Giriş yapan kullanıcı:" whoami
Güncellenmiş komut dosyasını çalıştırdıktan sonra olan budur.


Bir komut dosyasından mesajları görüntüleme

Artık echo komutunu kullanarak açıklayıcı notlar yazdırabiliriz. Linux araçlarını kullanarak bir dosyayı nasıl düzenleyeceğinizi bilmiyorsanız veya daha önce echo komutunu görmediyseniz, bu kaynağa bir göz atın.

Değişkenleri Kullanma

Değişkenler, örneğin diğer komutlar tarafından kullanılacak komutların sonuçları gibi bilgileri bir komut dosyasında saklamanıza izin verir.

Çalışmalarının sonuçlarını kaydetmeden tek tek komutları yürütmekte yanlış bir şey yoktur, ancak bu yaklaşımın olanakları çok sınırlıdır.

Bash betiklerinde kullanılabilecek iki tür değişken vardır:

  • Ortam Değişkenleri
  • Kullanıcı değişkenleri

Ortam Değişkenleri

Bazen kabuk komutlarının bazı sistem verileriyle çalışması gerekir. Örneğin, geçerli kullanıcının ana dizinini şu şekilde listeleyebilirsiniz:

#! / bin / bash # kullanıcı ana sayfasını görüntüle echo "Geçerli kullanıcının evi: $ HOME"
Lütfen $ HOME sistem değişkenini çift tırnak içinde kullanabileceğimizi unutmayın, bu sistemin onu tanımasını engellemeyecektir. Yukarıdaki betiği çalıştırırsanız olan budur.


Bir komut dosyasında bir ortam değişkeni kullanma

Ekranda dolar işareti görmek isterseniz ne olur? Hadi bunu deneyelim:

Echo "Cebimde 1 dolarım var"
Sistem, alıntılanan dizedeki dolar işaretini algılar ve bir değişkene başvurduğumuzu düşünür. Komut dosyası, tanımsız $ 1 değişkeninin değerini görüntülemeye çalışacaktır. İstediğimiz bu değil. Ne yapalım?

Dolar işaretinden önceki ters eğik çizgi kaçış karakteri bu durumda yardımcı olabilir:

Echo "Cebimde \ 1$ var"
Komut dosyası şimdi tam olarak bekleneni verecektir.


Dolar İşareti Çıktısı Almak İçin Bir Kaçış Dizisi Kullanma

Kullanıcı değişkenleri

Ortam değişkenlerine ek olarak, bash komut dosyaları, komut dosyasında kendi değişkenlerinizi ayarlamanıza ve kullanmanıza olanak tanır. Bu değişkenler, betik yürütmeyi bitirene kadar değerlerini korur.

Sistem değişkenlerinde olduğu gibi, kullanıcı değişkenlerine dolar işareti kullanılarak erişilebilir:
TNW-CUS-FMP - hizmetlerimizde %10 indirim için promosyon kodu, 7 gün içinde etkinleştirilmeye hazır
#! / bin / bash # değişkenleri test etme notu = 5 kişi = "Adam" echo "$ kişi iyi bir çocuk, $ sınıfında"
Böyle bir betiği çalıştırdıktan sonra olan budur.


Bir komut dosyasındaki özel değişkenler

Komut değiştirme

Bash betiklerinin en kullanışlı özelliklerinden biri, komutların çıktısından bilgi çıkarma ve onu değişkenlere atama yeteneğidir, bu da bu bilgilerin betik dosyasında herhangi bir yerde kullanılmasına izin verir.

Bu iki şekilde yapılabilir.

  • Geri tik ile ""
  • $ () kullanarak
İlk yaklaşımı kullanarak, backtick yerine tek bir alıntı kullanmadığınızdan emin olun. Komut, bu tür iki simgeye dahil edilmelidir:

Mydir = `pwd`
İkinci yaklaşımda, aynı şey şöyle yazılır:

Mydir = $ (pwd)
Ve senaryo sonunda şöyle görünebilir:

#! / bin / bash mydir = $ (pwd) echo $ mydir
İşlemi sırasında, pwd komutunun çıktısı, içeriği echo komutunu kullanarak konsola gidecek olan mydir değişkenine kaydedilecektir.


Bir komutun sonuçlarını bir değişkende saklayan bir komut dosyası

matematiksel işlemler

Bir komut dosyasında matematiksel işlemler gerçekleştirmek için $ ((a + b) gibi bir yapı kullanabilirsiniz):

#! / bin / bash var1 = $ ((5 + 5)) echo $ var1 var2 = $ (($ var1 * 2)) echo $ var2


Bir komut dosyasındaki matematik işlemleri

If-then kontrol yapısı

Bazı senaryolar, komut yürütme akışının kontrolünü gerektirir. Örneğin, bir değer beşten büyükse, bir eylem gerçekleştirmeniz gerekir, aksi takdirde - başka. Bu pek çok durumda geçerlidir ve if-then kontrol yapısı burada bize yardımcı olacaktır. En basit haliyle, şöyle görünür:

Eğer o zaman fi komutlarını komutla
Ve işte çalışan bir örnek:

#! / bin / bash eğer pwd ise yankı "Çalışıyor" fi
Bu durumda pwd komutu başarılı bir şekilde tamamlanırsa konsolda "çalışıyor" yazısı görüntülenecektir.

Bilgimizi kullanalım ve daha karmaşık bir senaryo yazalım. Diyelim ki / etc / passwd'de belirli bir kullanıcı bulmanız gerekiyor ve onu bulabilirseniz var olduğunu bildirin.

#! / bin / bash user = likegeeks eğer grep $ user / etc / passwd ise echo "$ kullanıcısı Var" fi
Bu betiği çalıştırdıktan sonra olan budur.


Kullanıcı ara

Burada / etc / passwd dosyasında kullanıcıyı bulmak için grep komutunu kullandık. Grep komutuna aşina değilseniz, açıklamasını bulabilirsiniz.

Bu örnekte, bir kullanıcı bulunursa, komut dosyası uygun bir mesaj görüntüler. Kullanıcı bulunamazsa ne olur? Bu durumda, komut dosyası bize hiçbir şey söylemeden yürütmesini sonlandıracaktır. Bize bundan da bahsetmesini istiyorum, bu yüzden kodu iyileştireceğiz.

If-then-else kontrol yapısı

Programın hem başarılı bir aramanın sonuçlarını hem de bir başarısızlığı raporlayabilmesi için if-then-else yapısını kullanacağız. İşte nasıl çalıştığı:

komut ise, else fi komutlarını komutlar
İlk komut sıfır döndürürse, yani başarılı bir şekilde yürütülürse, koşul doğru olur ve yürütme else dalını takip etmez. Aksi takdirde, sıfırdan farklı bir şey döndürülürse, bu, başarısızlık veya yanlış bir sonuç anlamına gelir, else'den sonraki komutlar yürütülür.

Şöyle bir script yazalım:

#! / bin / bash user = başka bir Kullanıcı ise grep $ user / etc / passwd ise echo "$ kullanıcısı Var" else echo "$ kullanıcısı mevcut değil" fi
İnfazı, else şubesi boyunca devam etti.


If-then-else yapısıyla bir komut dosyası çalıştırma

Pekala, devam edelim ve kendimize daha zor koşulları soralım. Ya birden fazla koşulu kontrol etmeniz gerekiyorsa, ancak birkaçını kontrol etmeniz gerekiyorsa? Örneğin, istenen kullanıcı bulunursa, başka bir koşul karşılanırsa bir mesaj görüntülemeniz gerekir - başka bir mesaj vb. Böyle bir durumda iç içe koşullar bize yardımcı olacaktır. Şuna benziyor:

Komut1 ise elif komut2'yi, ardından fi komutlarını verir.
İlk komut, başarılı yürütüldüğünü gösteren sıfır döndürürse, ilk sonra bloğundaki komutlar yürütülür, aksi takdirde, ilk koşul yanlış çıkarsa ve ikinci komut sıfıra dönerse, ikinci kod bloğu yürütülür. idam edilecek.

#! / bin / bash user = başka bir Kullanıcı ise grep $ user / etc / passwd ise yankı "$ user Var" elif ls / home sonra echo "Kullanıcı yok ama yine de / home altında bir dizin var" fi
Böyle bir komut dosyasında, örneğin, arama herhangi bir sonuç döndürmediyse useradd komutunu kullanarak yeni bir kullanıcı oluşturabilir veya başka yararlı bir şey yapabilirsiniz.

Rakamları karşılaştırma

Betiklerde sayısal değerler karşılaştırılabilir. Aşağıda ilgili komutların bir listesi bulunmaktadır.
n1 -eq n2 n1, n2'ye eşitse true döndürür.
n1 -ge n2 n1, n2'den büyük veya ona eşitse true döndürür.
n1 -gt n2 n1, n2'den büyükse true döndürür.
n1 -le n2 n1, n2'den küçük veya ona eşitse true döndürür.
n1 -lt n2 n1, n2'den küçükse true döndürür.
n1 -ne n2 n1, n2'ye eşit değilse true değerini döndürür.

Örnek olarak karşılaştırma operatörlerinden birini deneyelim. İfadenin köşeli parantez içine alındığına dikkat edin.

#! / bin / bash val1 = 6 ise [$ val1 -gt 5] ise echo "$ val1 test değeri 5'ten büyük" aksi takdirde echo "$ val1 test değeri 5'ten büyük değil" fi
Bu komutun çıktısı budur.


Komut dosyalarındaki sayıları karşılaştırma

val1 değişkeninin değeri 5'ten büyüktür, sonuç olarak, karşılaştırma operatörünün o zaman dalı yürütülür ve konsolda karşılık gelen bir mesaj görüntülenir.

Dize karşılaştırması

Ayrıca scriptlerdeki string değerlerini de karşılaştırabilirsiniz. Karşılaştırma operatörleri oldukça basit görünüyor, ancak dizi karşılaştırma işlemlerinin aşağıda değineceğimiz belirli özellikleri var. İşte operatörlerin bir listesi.
str1 = str2 Dizeleri eşitlik açısından test eder, dizeler aynıysa true değerini döndürür.
s tr1! = str2 Dizeler aynı değilse true değerini döndürür.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1> str2 str1 str2'den büyükse true değerini döndürür.
-n str1 str1 sıfırdan büyükse true değerini döndürür.
-z str1 str1'in uzunluğu sıfır ise true değerini döndürür.

İşte bir komut dosyasındaki dizeleri karşılaştırmaya bir örnek:

#! / bin / bash user = "likegeeks" eğer [$ user = $ USER] ise echo "$ user şu anda oturum açmış olan kullanıcıdır" fi
Komut dosyasının yürütülmesinin bir sonucu olarak aşağıdakileri elde ederiz.


Komut dizilerinde dizeleri karşılaştırma

İşte dize karşılaştırmanın bahsetmeye değer bir özelliği. Yani, ">" ve " operatörleri<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>"Bir çıktı yönlendirme komutu olarak.

Bu operatörlerle çalışmak kodda şöyle görünür:

#! / bin / bash val1 = metin val2 = [$ val1 \> ise "başka bir metin"
İşte senaryonun sonuçları.


Dizelerin karşılaştırılması, verilen uyarı

Komut dosyasının yürütülmesine rağmen bir uyarı oluşturduğunu unutmayın:

./myscript: satır 5: [: çok fazla argüman var
Bu uyarıdan kurtulmak için $ val2'yi çift tırnak içine alın:

#! / bin / bash val1 = text val2 = "başka bir metin" eğer [$ val1 \> "$ val2"] ise yankı "$ val1 $ val2'den büyük" değilse echo "$ val1 $ val2'den küçük" fi
Şimdi her şey olması gerektiği gibi çalışıyor.


Dize karşılaştırması

">" ve " operatörlerinin bir başka özelliği<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

likegeeks likegeeks
Dosyam adını vererek kaydedelim ve ardından terminalde aşağıdaki komutu çalıştıralım:

Dosyamı sırala
Dosyadaki satırları şu şekilde sıralayacaktır:

Beğenenler
Sıralama komutu varsayılan olarak satırları artan düzende sıralar, yani örneğimizdeki küçük harf büyük harften daha küçüktür. Şimdi aynı stringleri karşılaştıracak bir script hazırlayalım:

#! / bin / bash val1 = Likegeeks val2 = likegeeks eğer [$ val1 \> $ val2] ise echo "$ val1 $ val2'den büyük" değilse echo "$ val1 $ val2'den küçük" fi
Çalıştırırsanız, bunun tersinin doğru olduğu ortaya çıkıyor - küçük harf artık büyük harften daha büyük.


Bir komut dosyasında sıralama komutu ve satır karşılaştırması

Karşılaştırma komutlarında daha az büyük harf bulunur. Buradaki dize karşılaştırması, ASCII karakter kodlarını karşılaştırarak yapılır, sıralama düzeni bu nedenle karakter kodlarına bağlıdır.

Sıralama komutu, sistem dili ayarlarında belirtilen sıralama düzenini kullanır.

Dosya kontrolleri

Aşağıdaki komutlar muhtemelen bash betiklerinde en sık kullanılanlardır. Dosyalarla ilgili çeşitli koşulları kontrol etmenizi sağlar. İşte bu komutların bir listesi.
-d dosyası Bir dosyanın var olup olmadığını ve bir dizin olup olmadığını kontrol eder.
-e dosya Dosyanın var olup olmadığını kontrol eder.
-f dosyası Dosyanın var olup olmadığını ve bir dosya olup olmadığını kontrol eder.
-r dosyası Dosyanın var olup olmadığını ve okunabilir olup olmadığını kontrol eder.
-s dosyası Dosyanın var olup olmadığını ve boş olmadığını kontrol edin.
-w file Dosyanın var olup olmadığını ve yazılabilir olup olmadığını kontrol eder.
-x dosyası Dosyanın var olup olmadığını ve yürütülebilir olup olmadığını kontrol eder.
dosya1 -nt dosya2 dosya1'in dosya2'den daha yeni olup olmadığını kontrol eder.
dosya1 -ot dosya2 dosya1'in dosya2'den daha eski olup olmadığını kontrol eder.
-O dosyası Dosyanın mevcut olup olmadığını ve mevcut kullanıcıya ait olup olmadığını kontrol eder.
-G dosyası Dosyanın var olup olmadığını ve grup kimliğinin mevcut kullanıcının grup kimliğiyle eşleşip eşleşmediğini kontrol eder.

Bu komutların yanı sıra bugün tartışılan diğer birçok komutun hatırlanması kolaydır. İsimleri, çeşitli kelimelerin kısaltmaları olup, yaptıkları kontrolleri doğrudan gösterir.

Pratikte komutlardan birini deneyelim:

#! / bin / bash mydir = / home / likegeeks eğer [-d $ mydir] ise echo "$ mydir dizini mevcut" cd $ mydir ls else echo "$ mydir dizini mevcut değil" fi
Bu komut dosyası, mevcut bir dizin için içeriğini görüntüler.


Bir dizinin içeriğini görüntüleme

Geri kalan komutları kendiniz deneyebileceğinize inanıyoruz, hepsi aynı şekilde uygulanıyor.

sonuçlar

Bugün, bash betikleri yazmaya nasıl başlayacağımızı ve bazı temel şeyleri ele aldık. Aslında, bash programlama konusu çok büyük. Bu makale, 11 makalelik geniş bir dizinin ilk bölümünün çevirisidir. Hemen devam etmek istiyorsanız - işte bu materyallerin orijinallerinin bir listesi. Kolaylık sağlamak için bu, az önce okuduğunuz çeviriyi içerir. Henüz pCloud hakkında bilginiz yoksa okuyabilirsiniz.

Linux için PCloud, bir uygulama görüntüsü olarak Linux için bir eşitleme uygulaması sunar (en son sürüm mevcuttur). Görünüşe göre basit bir sorunun "istemciyi başlatma - istemciyi senkronize etme - kapatma" sürecini otomatikleştirmeye yönelik çözümü, pCloud istemcisinin özellikleriyle ilgili birkaç sorunu çözme ihtiyacına yol açtı. Çözüm, xfce grafik ortamı için verilmiştir.

Sonuç olarak, sürecin otomasyonunu otomatikleştirmeye yönelik çözüm, bir programa göre iki veya üç görevin başlatılmasıyla sonuçlandı (bkz.).

pCloud istemcisini başlatma

İstemciyi başlatmak için basit bir komut dosyası kullanılır, örneğin pcloud1.sh

#! / bin / bash
/ path_to_file / pcloud

Ve özel görev komutu

DISPLAY'i dışa aktar =: 0 && /path/pcloud1.sh

Yol - pcloud1.sh komut dosyasının yolu

Başlangıçta pcloud1.sh'a bir çıkış satırı eklemek (pcloud1.sh'ı tamamlamak) istenen sonucu vermedi. Görev yöneticisinde gözlemlenen 2 süreç vardı:

Pcloud1.sh
sh -c dışa aktarma EKRAN =: 0 && /path/pcloud1.sh

pcloud1.sh'nin görev yöneticisinde "askıda kalmasını" önlemek için, pcloud1.sh başlatıldıktan bir dakika sonra bir zamanlamaya göre başlatılan pcloud2.sh komut dosyası oluşturuldu. pcloud1.sh

#! / bin / bash
killall -s TERM pcloud1.sh
uyku 1 && çıkış

pCloud İstemcisini Durdurma

Bu senaryo, yaratılışı açısından en çok zaman alan ve iki nedenden dolayı açıklanıyordu.

Soru 1. Müşterinin çalışmasına çeşitli süreçler eşlik etmeye başladı. Örneğin, istemciyi başlattığınızda ve ardından görev yöneticisinde tüm pencereleri otomatik olarak açtığınızda, 6 pcloud işlemi görebilirsiniz:


Ana istemci penceresini ve pCloudDrive bulutunun içeriğini görüntüleyen dosya yöneticisi örneğini kapattıktan sonra, görev yöneticisinde 5 pcloud işlemi kalacaktır:


İstemciyi kapatmak için bir terminal komutu olmadığından, çözümü, pcloud işlemini pid değeriyle, yani kill -15 pid_pcloud komutuyla "yumuşak" sonlandırmak için uygulayabilirsiniz.

Ancak pcloud işleminin pidini talep ederseniz, sonuç ya pcloud işlemlerinin pidine karşılık gelen 6 grup sayı (örnek: 16129 16103 16077 16048 16036 16032) veya 5 grup (örnek: 29419 29398 29352 29324) olacaktır. 29320). Bu pid değerleri her seferinde değişecektir.

İşlem sayısı (5 veya 6), istemci başladığında otomatik olarak açılan tüm pencereleri açıp açmadığınıza veya bu pencerelerin kapalı olup olmadığına ve yalnızca masaüstü standındaki (sistem paneli, tepsi) durum simgesinin etkin olup olmadığına bağlıdır.

Doğal bir soru ortaya çıkıyor: hangi süreç kapatılmalı?

Soru 2. pCloud istemcisi başladığında, biri istemci penceresi ve ikincisi, içeriği pCloud hesap bulut alanının içeriği olan pCloudDrive açık dizinine karşılık gelen dosya yöneticisinin bir örneği olan 2 pencere otomatik olarak açılır. içine monte edilmiş, örneğin:



pCloud istemcisini kapattıktan sonra istemci penceresi (üstteki şekil) kaybolursa, ikinci pencere açık kalacaktır. İstemcinin kapatılması sırasında pCloud bulutunun bağlantısı kaldırıldığından ikinci pencerenin içeriği boş olacaktır.

Soru: ve otomatik olarak nasıl kapatılır?

Not. Açık pCloud uygulama penceresinin kapatılması sorusu sorulmaz, çünkü xfce'de paneldeki (sistem tepsisi, tepsi) simge yalnızca "senkronize" veya "senkronize" durumunu gösterir. Yüklenen veya indirilen dosyaların sayısı ve işlemin hızı hakkındaki bilgiler, pCloud uygulamasının açık penceresinin altında görüntülenir.

Sorulan soruları sırasıyla cevaplayacağız.

Cevap 1. Deneysel olarak, pcloud istemcisinden çıkmak için, pCloud Drive işlemine karşılık gelen en küçük pid değeriyle pcloud işlemini kapatmak gerektiği bulundu (görev yöneticisine bakın). Bu nedenle, otomasyonun en zor işi, daha sonra bir değişkene atamak için elde edilen değerlerden en küçük pid'i seçmek olacaktır.

Anlaşıldığı üzere, bu sorun en az dört şekilde çözülebilir. Ayrıca tüm pcloud işlemlerinin "yumuşak" olarak kapatılması, işlem adını belirten killall komutuyla yapılabilir. 5'i yazılan tüm çözümler aynı sonucu verdiği için aşağıda listelenmiştir.

Seçenek 1: killall -s TERM pcloud

Burada her şey açık. Tüm pcloud işlemlerini sonlandırmak için bir komut verilir.

Sonraki üç yöntem, bir dizi ardışık işlemdir. İlk olarak, tüm pcloud örneklerinin pid değerleri alınır ve bir dosyaya yazılır (örneğin, pcloud.txt). Dosyanın içeriği 5 veya 6 grup sayı dizisidir (yukarıdaki açıklamaya bakın). Ardından, ortaya çıkan pid değerleri serisinden son grup (5 basamak) "yakalanır" ve bir değişkene (örneğin, VAR) atanır. Son adım, pcloud.txt dosyasındaki en düşük pid değeriyle kill -15'i yürütmekle aynı olan kill -15 $ VAR komutunu yürütmektir.

2, 3, 4 seçenek:
pidof pcloud> ~ / pcloud.txt
VAR = `cat ~ / pcloud.txt | grep -o * $`
öldür -15 $ VAR

Pidof pcloud> ~ / pcloud.txt
VAR = `cat ~ / pcloud.txt | awk "($ NF yazdır)" `
öldür -15 $ VAR

Pidof pcloud> ~ / pcloud.txt
VAR = `cat ~ / pcloud.txt | devir | kesme -d "" -f 1 | devir
öldür -15 $ VAR

1-4 varyantları Linuxmint.com.ru forumunun kullanıcıları tarafından slant (2), Chocobo (3 ve 4), demonlibra (1) takma adlarıyla önerildi. Bu fırsatı değerlendirerek kendilerine bir kez daha şükranlarımı sunmak istiyorum.

Seçenek 5

pgrep komutuyla pid pcloud işlemlerinin bir listesi alınırken, pcloud.txt dosyasındaki sonuç bir sütunda gösterilecektir, yani her pid değeri artan sırada yeni bir satırda yer alacaktır, örneğin:

29320
29324
29352
29398
29419

Sonraki adım, değişkene pcloud.txt dosyasının ilk satırının değerini atamaktır.

Pgrep pcloud> ~ / pcloud.txt
VAR = `sed -n" 1p "~ / pcloud.txt`
öldür -15 $ VAR

Cevap 2. Etkin Thunar penceresini thunar -q komutuyla (terminalde thunar --help çalıştırıldıktan sonra elde edilen) kapatma komutunun görünen basitliğine rağmen, bu durumda çalışmaz.

İşlem ağacını inceledikten sonra, aktif işlemler listesinde Thunar --daemon olduğu bulundu:


pCloud istemcisi tarafından açılan Thunar penceresini kapatmanın üç yolu vardır:

A) tüm aktif Thunar işlemlerini öldür killall -s TERM / usr / bin / Thunar;

B) Thunar işleminin pidini alın, bir değişkene yazın ve kill komutu -15 değişken_değeri ile sonlandırın

ÇIKTI = "$ (pidof / usr / bin / thunar)"
öldür -15 $ (ÇIKTI)

C) Thunar işleminin pid'ini alın, bir dosyaya yazın, dosyayı okumadan elde edilen değeri değişkene atayın ve kill komutuyla sonlandırın -15 değişken_değer

Pidof / usr / bin / Thunar> ~ / thunar.txt
VAR2 = `cat ~ / thunar.txt`
öldür -15 $ VAR2

Tüm seçenekler eşittir. Yürütülmesinin sonucu, thunar --daemon ve Thunar işlemlerinin sona ermesidir (pCloudDrive dizininin içeriğine sahip açık bir pencereye karşılık gelir).

İngilizce konuşulan forumda thunar --daemon işleminin "önemi" sorusu üzerine, bunun Thunar'ın ve bir bütün olarak sistemin işlevselliğini önemli ölçüde etkilemediği bilgisi bulundu. Tek dezavantajı, bu işlem olmadan, bağlı çıkarılabilir medyanın (örneğin bir flash sürücü) yalnızca Thunar penceresi açıkken otomatik olarak monte edilmesidir. Thunar'ın hiçbir örneği çalışmıyorsa, çıkarılabilir medya otomatik olarak bağlanmaz. Bu durumda Thunar'ı açmanız ve manuel olarak bağlamanız gerekir, örneğin:


Her durumda, sistemin bir sonraki başlangıcından sonra, thunar --daemon otomatik olarak başlatılacaktır.


dosyanın içeriğine göre belirlenir

/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml (bkz --daemon)



Toplamda, pCloud istemcisini kapatmak için komut dosyası (örneğin, pcloud3.sh) aşağıdaki gibi olabilir (bir seçenek ve bir yöntem seçilir):

#! / bin / bash
seçenek 1, 2, 3, 4, 5
uyku 5
yöntem a, b, c
uyku 5 && çıkış

5 saniyelik duraklama uyku 5 komutu, komut dosyasını izleme süreçleri için test etmek için tanıtıldı. Çalışan bir komut dosyasında kullanmak zorunda değilsiniz.

21:40 - 22:20 arasında pCloud ile günlük 40 dakikalık otomatik senkronizasyon için örnek özel cron işi

40 21 * * * EKRAN dışa aktar =: 0 && /home/user/Tools/scripts/pcloud1.sh
41 21 * * * /home/user/Tools/scripts/pcloud2.sh

Kendimizi yalnızca başlatma ve kapatma komut dosyalarıyla, yani pcloud1.sh ve pcloud3.sh ile sınırlandırırsak, pcloud3.sh komut dosyası pcloud'u pid işlemiyle en küçük değil, bir tane daha, yani elde edilen değerler dizisi, örneğin,

28354 28355 28359 28371 28399 28426 28449 28684 ,

İkincisi seçilmelidir (28355). Açıklama, 28354'ün pcloud1.sh etkin komut dosyasına karşılık gelmesidir.

Buna göre, bu durumda pcloud işlemlerini kapatmak için aşağıdaki kod kullanılacaktır:

Pgrep pcloud> ~ / pcloud.txt
VAR = `sed -n" 2p "~ / pcloud.txt`
öldür -15 $ VAR

Ardından özel görev şu şekli alır, örneğin:

40 21 * * * EKRAN dışa aktar =: 0 && /home/user/Tools/scripts/pcloud1.sh
20 22 * ​​​​* * /home/user/Tools/scripts/pcloud3.sh

Her şeyden önce, ne olduğuna bir bakalım senaryo ve ne için.

Senaryoİngilizce'den çevrilmiş - senaryo... Hepimiz film izliyoruz, çoğumuz performans izliyoruz. Bir film / oyun yaratmak için, senaryo yazarları onlar için senaryolar yazarlar, buna dayanarak aktörler sahne sahne, filmi / oyunu oluşturan sahnede rollerini gerçekleştirirler. Senaryo oluşturma çalışması oldukça zahmetlidir, burada her şeyi en küçük ayrıntısına kadar hesaba katmanız gerekir, böylece sonunda sanatçılar senaryo yazarının planını yerine getirebilir ve izleyici tüm işi görebilir.

Benzer şekilde, komut dosyaları, işletim sisteminde daha kolay ve daha hızlı hale getirmek için kullanıcının bir araya getirdiği (kod) görevlerin bir listesini gerçekleştirmek için yazılır. Basit scriptler yazmak için bir programcı eğitimine sahip olmak hiç de gerekli değildir.

İlk önce, en basitini oluşturalım komut dosyası kabuğu sistemi güncellemek için.

Tüm işlemleri sistemle yapacağım Ubuntu ancak diğer sistemlere de uygulanabilirler Linux elde edilen Ubuntu... Bunun için ihtiyacımız var: Metin düzeltici bir komut dosyası (kod) oluşturmak için gerekli görevlerle doldurmak ve terminal- oluşturulan komut dosyasını yürütmek için. Bu araçlar herhangi bir dağıtıma yüklenir Linux varsayılan.

Yani, bir metin düzenleyici açın Gedit ve adın altına ilk gerekli karakterleri girin shebang.
shebang programlamada, iki karakterden oluşan bir dizidir: bir karma ve bir ünlem işareti ( #! ) komut dosyasının başında. Ve bu karakterlere boşluk bırakmadan ekleyin / bin / sh- betiğin yürütüleceği yorumlayıcı. / bin / sh- bu genellikle Bourne kabuğu veya geçen uyumlu bir komut satırı yorumlayıcısı "yol / için / komut dosyası" ilk parametre olarak
Komut dosyasının ilk gerekli satırı şöyle görünecektir:

# İlk Ubuntu yükseltme betiğim

Satırın en başındaki kare işareti (#), yorumlayıcıya/terminale bu satırın okunması ve yürütülmesi gerekmediğini açıkça belirtir. Bu komut dosyasının kodunda satıra ihtiyaç vardır, böylece komut dosyası yaratıcısı, koddaki belirli bir segment / sahnede ne yürüteceğini kendisi bilir, böylece gelecekte bu tür çok sayıda satır olduğunda kafanız karışmaz. . Karma işaretli bu tür satırlara denir - yorum yaptı .

sudo uygun güncelleme
sudo uygun yükseltme -y

-y ikinci komutun sonunda, yorumlayıcıya / terminale, bu eylemin / komutun, kullanıcı tarafından bir tuşa basılarak ek onay olmadan otomatik olarak gerçekleştirilmesi gerektiğini açıkça belirtir. Giriş. y- İngilizceden kısaltılmış Evet, yani Evet.

Bu kadar. İlk komut dosyanız oluşturuldu. Resimdeki gibi bir şeye sahip olmalısınız:


Oluşturulan dosyayı / komut dosyasını kaydetmek ve vermek için kalır İsim sonunda gerekli bir uzantı ile - .NS... Uzantı .NS yürütülebilir dosyaya atanır.
ona verdim İsim - update.sh kaydetmek Ana klasör kullanıcı:


Oluşturulan dosyanın/komut dosyasının çalıştırılabilir olması için buna izin verilmesi gerekir. Bu iki şekilde yapılabilir.

1. Terminalde aşağıdaki komutu çalıştırın:

sudo chmod + x update.sh

2. Veya dosya yöneticisini açın Ana klasör(oluşturulan komut dosyasını kaydettiğiniz yer), bağlam menüsünde dosyaya sağ tıklayın - Özellikler - Haklar ve öğeyi etkinleştirin - Verim: Dosyanın bir program olarak çalışmasına izin ver:


Oluşturulan komut dosyasını çalıştırmak için bir terminal açmanız gerekir (ki bu makalenin en başında yazdım, terminalin komut dosyasını yürütmek için gerekli bir özellik / araç olduğunu), girin NS, komut dosyasının adı bir boşlukla ayrılır - update.sh ve tuşuna basın Giriş:


Veya girdiğimiz terminalde NS ve oluşturulan dosyayı komut dosyasıyla birlikte dosya yöneticisinden sürükleyin (ayrıca bir boşlukla ayırın):


Komuttan sonra dosya yolu görüntülendikten sonra NS ve bir boşluk, sadece tuşa basın Girmek(Girin) sistemi güncellemek için:


Artık istediğiniz zaman kendi betiğiniz tarafından oluşturulmuş bir sistem güncellemesi yapabilirsiniz.

Evet, birileri terminalde bu iki komutu çalıştırarak sistemi güncellemenin zor olmadığını iddia edebilir, neden şişip bazı komut dosyaları oluşturalım? Tamam. Ancak bu, "çömlek yakanların tanrılar olmadığını" göstermek için basit bir senaryo oluşturmaya bir örnektir.

Linux'ta komut dosyası yazma (örnekle öğrenme)

———————————————————————————-

1. Giriş

Senaryo yazmak için gerekenler
Komut satırı araçlarında ve bunların gerekli seçeneklerinde yeterlilik.
İlkokul düzeyinde temel İngilizce bilgisi zarar vermez.

Komut dosyalarına neden ihtiyaç duyulur?
İlk olarak, bir linux sunucusunun yönetimi, bir dereceye kadar, aynı komutların sistematik olarak yürütülmesine bağlıdır. Üstelik bu komutların bir kişi tarafından yapılması gerekli değildir. Makine tarafından yürütülmek üzere programlanabilirler.
İkinci olarak, (birdenbire) 20-1000'e varan ortak bir görevi yerine getirmek bile ... tekrarlayan işlemleri bir komut dosyasında uygulamak ÇOK daha kolaydır.

komut dosyası nedir
Komut dosyası, bir bilgisayarın belirli bir sırada ve belirli bir zamanda yürütmesi gereken bir dizi talimattır. Talimatlar, dahili kabuk komutları (döngüler, koşullar, metin bilgilerinin işlenmesi, ortam değişkenleriyle çalışma vb.) veya konsolda gerekli parametrelerle yürüttüğümüz herhangi bir program olabilir.

Senaryo nasıl yazılır
Bizim durumumuzda, komut dosyası yürütme özniteliklerine sahip bir metin dosyası olacaktır. Bir komut dosyası, UNIX dünyasında sha-bang olarak adlandırılan # ! ile başlıyorsa, bu, sisteme komut dosyasını yürütmek için hangi yorumlayıcıyı kullanacağını söyler. Bunu anlamak zorsa, tüm komut dosyalarını tam olarak #! / Bin / bash veya #! / Bin / sh satırından yazmaya başlayacağımızı ve ardından bunlara komutlar ve yorumlar geleceğini unutmayın.

ayrılık sözleri
Senaryodaki hemen hemen her satıra mümkün olduğunca çok yorum yazmanızı içtenlikle tavsiye ederim. Zaman geçecek ve bir kez yazılan senaryoyu değiştirmeniz veya modernleştirmeniz gerekecek. Senaryoda ne yazdığını hatırlamıyorsanız veya anlamıyorsanız, onu değiştirmek zorlaşır, sıfırdan yazmak daha kolaydır.

Hangi komut dosyalarına ihtiyacımız olabilir:

    sistem önyüklendiğinde güvenlik duvarı kurallarının ayarlanması.
    ayarların ve verilerin yedeklenmesi.
    posta sunucusuna posta kutuları ekleme (daha doğrusu mysql veritabanına)
    belirli bir saatte (tercihen her gece) proxy sunucu günlüklerini tarayan ve indirilen trafik miktarı hakkında uygun bir web raporu üreten bir program başlatır.
    birinin ssh aracılığıyla sunucumuza erişim sağladığına dair bilgileri, bağlantı süresini ve müşterinin adresini bize posta yoluyla göndermek.

Komut dosyası oluşturma teknikleri hakkında
Bir metin dosyası oluşturun, düzenleyin, yürütme izinlerini ayarlayın, başlatın, hataları kontrol edin, düzeltin, başlatın, hataları kontrol edin ...
Her şey yalandığında ve düzgün çalıştığında, belirli bir süre için otomatik yüklemeye veya zamanlayıcıya koyarız.

———————————————————————————-

2. Dahili BASH dilinde komut dosyası yazmayı öğrenmek
orijinal: https://www.linuxconfig.org/Bash_scripting_Tutorial

Bu öğretici, dahili Bash dilini kullanan komut dosyası oluşturma (komut dosyası oluşturma) teknikleri hakkında önceden bilgi sahibi olmadığını varsayar. Bu öğretici ile, kısa sürede komut dosyası oluşturmanın çok kolay bir iş olduğunu göreceksiniz. Öğreticimize "Merhaba Dünya!" dizesini veren basit bir komut dosyasıyla başlayalım. (İngilizce'den çevrilmiştir - Herkese merhaba!)

1. Senaryo "Herkese merhaba"
İşte ilk bash betiği örneğiniz:

#! / bin / bash
yankı "Merhaba Dünya"

Hello_world.sh dosyamızı içeren dizine gidin ve onu çalıştırılabilir hale getirin:

Kod: Her şeyi seçin $ chmod + x hello_world.sh

Yürütme için komut dosyasını çalıştırın

Kod: Tümünü Seçin $ ./hello_world.sh

2. Basit bir arşivleme bash betiği

#! / bin / bash
tar -czf myhome_directory.tar.gz / ev / kullanıcı

Kod: Tümünü Seç $ ./backup.sh

$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz

3. Değişkenlerle Çalışmak
Bu örnekte, basit bir değişken tanımladık ve bunu echo komutunu kullanarak ekrana yazdırdık.

#! / bin / bash
STRING = "MERHABA DÜNYA !!!"
yankı $ STRING

Kod: Tümünü Seçin $ ./hello_world.sh
SELAM DÜNYA !!!

Değişkenler içeren arşivleme betiğimiz:

#! / bin / bash
OF = myhome_directory _ $ (tarih +% Y% m% d) .tar.gz
EĞER = / ev / kullanıcı
tar -czf $ OF $ IF

Kod: Tümünü Seç $ ./backup.sh
tar: Üye adlarından baştaki "\" kaldırılıyor
$ du -sh * tar.gz
41M myhome_directory_201000123.tar.gz

3.1 Küresel ve yerel değişkenler

#! / bin / bash
# Global bir değişken tanımlayın
# Böyle bir değişken bu komut dosyasında herhangi bir yerde kullanılabilir
VAR = "genel değişken"
işlev bash (
# Yerel bir değişken tanımlayın
# Böyle bir değişken sadece tanımlandığı fonksiyon için geçerlidir.
yerel VAR = "yerel değişken"
yankı $ VAR
}
yankı $ VAR
bash
# Global değişkenin değişmediğine dikkat edin
yankı $ VAR

Kod: Tüm $ ./variables.sh'yi seçin
küresel değişken
yerel değişken
küresel değişken

4. Komut dosyasına argümanları iletmek

#! / bin / bash
# Argümanlara erişmek için önceden tanımlanmış değişkenleri kullanın
# Argümanları ekrana göster
echo $ 1 $ 2 $ 3 '-> echo $ 1 $ 2 $ 3'

# Ayrıca argümanlara args = (“ [e-posta korumalı]»)
# Argümanları ekrana göster
echo $ (args) $ (args) $ (args) ‘-> argümanlar = (“ [e-posta korumalı]"); echo $ (args) $ (args) $ (args) '

# Bir değişken kullanın [e-posta korumalı] tüm argümanları bir kerede çıktılamak için
Eko [e-posta korumalı]'-> yankı [e-posta korumalı]

Komut dosyasına iletilen argüman sayısını görüntülemek için $ # değişkenini kullanın
echo Geçilen argüman sayısı: $ # ‘-> echo Geçilen argüman sayısı: $ #'

Kod: Tümünü Seç $ ./arguments.sh Bash Komut Dosyası Eğitimi
Bash Komut Dosyası Eğitimi -> echo $ 1 $ 2 $ 3
Bash Komut Dosyası Eğitimi -> args = (" [e-posta korumalı]"); echo $ (args) $ (args) $ (args)
Bash Komut Dosyası Eğitimi -> yankı [e-posta korumalı]
Geçilen argüman sayısı: 3 -> echo Geçilen argüman sayısı: $ #

5. Bir komut dosyasında kabuk komutlarını yürütme

#! / bin / bash
# kabuk komutunu çalıştırmak için "" "" geri tepmelerini kullanın
echo 'isim -o'
# şimdi tırnak işaretleri olmadan deneyelim
yankı uname -o

Kod: Tümünü seçin $ uname -o
GNU / Linux
$ ./bash_backtricks.sh
GNU / Linux
isim -o

Gördüğünüz gibi, ikinci durumda, yürütmenin sonucu değil, komutun kendisi görüntülendi.

6. Kullanıcı girdisini okuma (etkileşim)

#! / bin / bash
echo -e "Merhaba, lütfen şu kelimeyi yazın: \ c"
kelimeyi oku
echo "Girdiğiniz kelime: $ word"
echo -e “Lütfen iki kelime girer misiniz? "
kelime1 kelime2 oku
echo "İşte girdiniz: \" $ word1 \ "\" $ word2 \ ""
echo -e “Bash komut dosyası oluşturma hakkında ne düşünüyorsunuz? "
# read komutu artık bir yanıtı varsayılan yerleşik değişken $ REPLY'ye kaydeder
okuman
echo “$ CEVAP dediniz, bunu duyduğuma sevindim! "
echo -e “En sevdiğiniz renkler neler? "
# -a bir diziye okumak için okuma komutu yapar
-a renkleri oku
echo "En sevdiğim renkler de $ (renkler), $ (renkler) ve $ (renkler) :-)"

Kod: Tümünü seçin $ ./read.sh
Merhaba, lütfen kelimeyi yazın: bir şey
Girdiğiniz kelime: bir şey
Lütfen iki kelime girer misiniz?
Debian Linux'u
İşte girdiniz: "Debian" "Linux"
Bash komut dosyası oluşturma hakkında ne düşünüyorsunuz?
iyi
İyi dedin, bunu duyduğuma sevindim!
En sevdiğin renkler neler?
mavi yeşil siyah
En sevdiğim renkler de mavi, yeşil ve siyah :-)

7. Tuzak kullanmak

#! / bin / bash
# tuzak ilan et
tuzak bashtrap INT
# ekranı temizle
açık;
# kanca işlevi, kullanıcı CTRL-C'ye bastığında yürütülür:
# Ekranda => Bash trap alt programı yürütülüyor!
# ancak komut dosyası yürütülmeye devam edecek
bashtrap ()
{
echo "CTRL + C Algılandı! ... bash tuzağı yürütülüyor!"
}
# komut dosyası 10'a kadar sayılacak
"seq 1 10"daki a için; yapmak
echo "$ a / 10 Çıkmak için."
uyku 1;
tamamlamak
echo "Bash Tuzağı Örneğinden Çık !!!"

Kod: Tümünü Seç $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL + C Algılandı! ... bash tuzağı yürütülüyor!
10/10
Bash Tuzağı Örneğinden Çık !!!

Gördüğünüz gibi, Ctrl-C tuş kombinasyonu komut dosyasının yürütülmesini durdurmadı.

8. Diziler
8.1 Basit bir dizi bildirme

#! / bin / bash
# 4 elemanlı basit bir dizi tanımlayın
ARRAY = ('Debian Linux' '' Redhat Linux 'Ubuntu Linux)
# Dizideki eleman sayısını alın
ELEMENTS = $ (# DİZİ [@])

# dizinin her bir elemanını bir döngüde çıktı
için ((i = 0; ben<$ELEMENTS;i++)); do
echo $ (ARRAY [$ (i)])
tamamlamak

Kod: Tümünü seçin $. / Arrays.sh
Debian Linux'u
Redhat Linux
Ubuntu
Linux

8.2 Diziyi dosyadan değerlerle doldurma

#! / bin / bash
# Bir dizi bildir
-a ARRAY bildir
# Yürütme komutu # stdin (genellikle klavye) bu dosyadan üretilecektir. Bu okumayı mümkün kılar
# dosyanın içeriğini satır satır ve sed ve/veya awk ile girilen her satırı ayrıştırın.
yürütme 10 sayalım = 0

LINE okurken<&10; do

DİZİ [$ sayısı] = $ SATIR
((saymak ++))
tamamlamak

echo Öğe sayısı: $ (# ARRAY [@])
# Dizi değerleri çıktısı
echo $ (ARRAY [@])
# dosyayı kapat
yürütme 10> & -

Kod: Tüm $ cat bash.txt dosyasını seçin
Debian Linux'u
Redhat Linux
Ubuntu
Linux
$ ./diziler.sh
Eleman sayısı: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Eğer-o zaman-aksi takdirde koşulları
9.1. "Aksi takdirde" koşullarının basit kullanımı
Köşeli parantez içindeki boşluklara dikkat edin, bunlar olmadan koşulun işe yaramayacağı.

#! / bin / bash
dizin = "./ BashScripting"

# dizinin var olup olmadığını kontrol edin
eğer [-d $ dizini]; sonra
echo "Dizin var"
Başka
echo "Dizin mevcut değil"
fi

Kod: Tümünü Seçin $ ./if_else.sh
Dizin mevcut değil
$ mkdir BashScripting
$ ./if_else.sh
Dizin var

9.2 Aksi takdirde iç içe koşullar

#! / bin / bash
# 4 değerinde bir değişken tanımlayın
seçim = 4
# Görüntüleniyor
yankı "1. bas"
yankı "2. komut dosyası "
yankı "3. öğretici

# Değişken dört olana kadar çalıştır
# Döngü
while [$ seçim -eq 4]; yapmak

# kullanıcı girdisini oku
seçimi oku
# aksi takdirde iç içe koşul
if [$ seçim -eq 1]; sonra

echo "Kelime seçtiniz: Bash"

eğer [$ seçim -eq 2]; sonra
echo "Kelime seçtiniz: Komut dosyası"
Başka

if [$ seçim -eq 3]; sonra
echo "Kelime seçtiniz: Öğretici"
Başka
echo "Lütfen 1-3 arasında bir seçim yapın!"
yankı "1. bas"
yankı "2. komut dosyası "
yankı "3. öğretici
echo -n “Lütfen bir kelime seçin? "
seçim = 4
fi
fi
fi
tamamlamak

Kod: Tümünü seçin $ ./nested.sh
1. Bash
2. Komut dosyası oluşturma
3. Eğitim

5

1. Bash
2. Komut dosyası oluşturma
3. Eğitim
Lütfen bir kelime seçin?
4
Lütfen 1-3 arasında bir seçim yapın!
1. Bash
2. Komut dosyası oluşturma
3. Eğitim
Lütfen bir kelime seçin?
3
Kelime seçtiniz: Öğretici

Böylece, ilk başta, "while" döngüsünün gövdesi yürütülür, çünkü değişken seçimi başlangıçta dörde eşittir. Sonra kullanıcı girişini ona okuruz ve eğer giriş 1.2 veya 3'e eşit değilse, o zaman döngünün gövdesinin tekrarlandığı bağlantılı olarak değişkenimizi tekrar 4'e eşit yaparız (yine 1.2 girmek gerekir) veya 3).

10. Karşılaştırmalar
10.1 Aritmetik karşılaştırmalar

Lt.<
-gt>
-le<=
-ge> =
-eq ==
-ne! =

#! / bin / bash

SAYI1 = 2
SAYI2 = 2
eğer [$ NUM1 -eq $ NUM2]; sonra
echo "Her İki Değer de Eşittir"
Başka
echo "Değerler eşit DEĞİLDİR"
fi

Kod: Tümünü Seç $ ./equals.sh
Her iki Değer de eşittir

#! / bin / bash
# Değişkenleri tamsayı değerleriyle tanımlayın
SAYI1 = 2
SAYI2 = 3
eğer [$ NUM1 -eq $ NUM2]; sonra
echo "Her İki Değer de Eşittir"
Başka
echo "Değerler eşit DEĞİLDİR"
fi

Kod: Tümünü Seç $ ./equals.sh
Değerler eşit DEĞİLDİR

#! / bin / bash
# Değişkenleri tamsayı değerleriyle tanımlayın
SAYI1 = 2
SAYI2 = 1
eğer [$ NUM1 -eq $ NUM2]; sonra
echo "Her İki Değer de Eşittir"
elif [$ NUM1 -gt $ NUM2]; sonra
echo "$ NUM1 $ NUM2'den büyüktür"
Başka
echo "$ NUM2, $ NUM1'den büyük"
fi

Kod: Tümünü Seç $ ./equals.sh
2, 1'den büyük

10.2 Sembolik-Metin Karşılaştırmaları

Aynısı
! = aynı değil
< меньще чем
> daha fazla
-n s1 değişkeni s1 boş değil
-z s1 değişkeni s1 boş

#! / bin / bash

S1 = "Bas"

S2 = "Komut Dosyası Oluşturma"
eğer [$S1 =$S2]; sonra

Başka
echo "Dizeler eşit DEĞİLDİR"
fi

Kod: Tümünü Seç $ ./statement.sh
Dizeler eşit DEĞİLDİR

#! / bin / bash
# S1 sembolik değişkenini bildir
S1 = "Bas"
# S2 sembolik değişkenini tanımlayın
S2 = "Bas"
eğer [$S1 =$S2]; sonra
echo "İki Dize de Eşittir"
Başka
echo "Dizeler eşit DEĞİLDİR"
fi

Kod: Tümünü Seç $ ./statement.sh
Her iki Dize eşittir

11. Dosyaları kontrol etme

B dosya adı Özel dosyayı engelle
-c dosya adı Özel karakter dosyası
-d dizin adı Dizin varlığını kontrol edin
-e dosya adı Dosya varlığını kontrol et
-f dosyaadı Bir dizin değil, normal dosya varlığını kontrol edin
-G dosya adı Dosyanın var olup olmadığını ve etkin grup kimliğine ait olup olmadığını kontrol edin.
-g dosya adı, dosya varsa ve set-group-id ise true.
-k dosya adı Yapışkan bit
-L dosya adı Sembolik bağlantı
-O dosya adı Dosya varsa ve etkin kullanıcı kimliğine aitse doğrudur.
-r dosya adı Dosyanın okunabilir olup olmadığını kontrol edin
-S dosya adı Dosyanın soket olup olmadığını kontrol edin
-s dosya adı Dosyanın sıfırdan farklı boyutta olup olmadığını kontrol edin
-u dosyaadı Dosya set-ser-id bitinin ayarlanıp ayarlanmadığını kontrol edin
-w dosya adı Dosyanın yazılabilir olup olmadığını kontrol edin
-x dosya adı Dosyanın yürütülebilir olup olmadığını kontrol edin

#! / bin / bash
dosya = "./ dosya"
eğer [-e $ dosyası]; sonra
echo "Dosya var"
Başka
echo "Dosya mevcut değil"
fi

Kod: Tümünü Seç $ ls
dosya.sh
$ ./dosya.sh
Dosya mevcut değil
$ dokunma dosyası
$ l
dosya dosyası.sh
$ ./dosya.sh
dosya var

Benzer şekilde, örnek için, dosyanın var olup olmadığını kontrol etmek için "while" döngülerini kullanabiliriz. Bu komut dosyası, dosya yokken uyuyacaktır. Bash olumsuzlayıcı "!" bu -e seçeneğini reddeder (ters çevirir).

12. Döngüler
12.1. Döngü için

#! / bin / bash
# döngü için
f için $ (ls / var /); yapmak
yankı $ f
tamamlamak

Bash komut satırından bir for döngüsü çalıştırma:

Kod: $ (ls / var /) içindeki f için her şeyi $ seçin; yankı $f yapın; done Kod: $'daki f için her şeyi seçin (ls / var /); yankı $f yapın; tamamlamak
yedekler
önbellek
kaza
oyunlar
kütüphane
yerel
kilit
kayıt
posta
tercih
Çalıştırmak
makara
tmp
www

12.2. Döngü sırasında

#! / bin / bash
SAYI = 6
# döngü sırasında
while [$ COUNT -gt 0]; yapmak

COUNT = COUNT-1 olsun
tamamlamak

Kod: Tümünü seçin $ ./while_loop.sh
Sayının değeri: 6
Sayının değeri: 5
Sayının değeri: 4
Sayının değeri: 3
Sayının değeri: 2
Sayının değeri: 1

12.3. Döngüye kadar

#! / bin / bash
SAYI = 0
# döngüye kadar
[$ COUNT -gt 5] tarihine kadar; yapmak
echo Sayının değeri: $ COUNT
COUNT = COUNT + 1 olsun
tamamlamak

Kod: Tümünü Seç $ ./until_loop.sh
Sayının değeri: 0
Sayının değeri: 1
Sayının değeri: 2
Sayının değeri: 3
Sayının değeri: 4
Sayının değeri: 5

12.4. Örtük koşullara sahip döngüler
Aşağıdaki örnekte, bir while döngüsünün koşulu, standart girdinin varlığıdır.
Döngünün gövdesi, standart çıktıdan read komutuna yönlendirilecek bir şey olduğu sürece yürütülür.

#! / bin / bash
# Bu komut dosyası boşlukları arayacak ve kaldıracak
# dosyalarda alt çizgi ile değiştiriliyor
YÖN = "."
Bir döngüdeki çıktıyı yeniden yönlendirerek bir okuma komutuyla bir döngüyü kontrol etme.
bulmak $ DIR -type f | dosyayı okurken; yapmak
# dosya adlarındaki boşlukları bulmak için POSIX sınıfını [: boşluk:] kullanın
if [["$ dosya" = * [[: boşluk:]] *]]; sonra
# boşlukları alt çizgi ile değiştirin
mv "$ dosyası" `echo $ dosyası | tr '' '_''
fi;
tamamlamak

Kod: Tümünü Seçin $ ls -1
script.sh
$ "boşluklu dosya"ya dokunun
$ l -1
boşluklu dosya
script.sh
$ ./script.sh
$ l -1
file_with_spaces
script.sh

13. Fonksiyonlar

#! / bin / bash
# Fonksiyonlar herhangi bir sırada bildirilebilir
işlev işlev_B (
yankı İşlev B.
}
işlev işlev_A (
yankı $ 1
}
işlev işlev_D (
yankı İşlev D.
}
işlev işlev_C (
yankı $ 1
}
# Arama işlevleri
# parametreyi fonksiyon A'ya iletin
function_A "İşlev A."
işlev_B
# parametreyi C fonksiyonuna iletin
function_C "Fonksiyon C."
işlev_D

Kod: Tümünü Seç $ ./functions.sh
A işlevi
İşlev B.
İşlev C.
İşlev D.

14. Operatör seçimi - Seç

#! / bin / bash
PS3 = 'Bir kelime seçin:'
# Seçme
"linux" "bash" "komut dosyası oluşturma" "eğitici" kelimesini seçin
yapmak
echo "Seçtiğiniz kelime: $ word"
# İptal, aksi takdirde döngü sonsuz olacaktır.
kırmak
tamamlamak
0 çıkışı

Kod: Tümünü Seç $ ./select.sh
1) linux
2) bash
3) komut dosyası oluşturma
4) öğretici
Bir kelime seçin: 4
Seçtiğiniz kelime: öğretici

15. Operatör seçimi - Vaka

#! / bin / bash
echo "Tercih ettiğiniz programlama / betik dili nedir"
yankı "1) bash"
yankı "2) perl"
yankı "3) fiton"
yankı "4) c++"
echo "5) Bilmiyorum!"
vakayı oku;
# basit vaka seçim yapısı
# bu örnekte $ durumunun sadece bir değişken olduğuna dikkat edin
# ve buna gerek yok. Bu sadece bir örnek
durumda $ durumda
1) echo "Bash'i seçtiniz" ;;
2) echo "Perl'i seçtiniz" ;;
3) echo "Fitonu seçtiniz" ;;
4) echo "c++ seçtiniz" ;;
5) çıkış
esac

Kod: Tümünü Seç $ ./case.sh
Tercih ettiğiniz programlama / betik dili nedir
1) bash
2) perl
3) bitki
4) c++
5) bilmiyorum!
4
c++ seçtiniz

———————————————————————————-

Daha detaylı bilgi çeşitli kaynaklardan, örneğin buradan elde edilebilir.
orijinal: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin ... -book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296