BASH - Koşullar ve Değişkenler İçin Yeni Başlayanlar Kılavuzu

Giriş

"BASH Başlayanlar Kılavuzu" nun üçüncü bölümüne hoş geldiniz. Eğer önceki iki makaleyi kaçırdıysanız, muhtemelen bu kılavuzu diğer BASH komut dosyası kılavuzlarından farklı kılan şeyi bilmek isteyeceksiniz.

Bu kılavuz, BASH'ın tam bir acemi tarafından yazılıyor ve öğrendiğim gibi öğrendiğiniz bir okuyucu olarak. BASH için acemi olduğum halde, yazdığım bir çok şey Windows platformu için yapılmış olsa da, bir yazılım geliştirme geçmişinden geliyorum.

İlk iki rehberi ziyaret ederek görebilirsiniz:

BASH komut dosyası için yeniyseniz, bununla devam etmeden önce ilk iki kılavuzu okumanızı öneririz.

Bu kılavuzda, kullanıcı girdisini test etmek ve komut dosyasının nasıl çalıştığını kontrol etmek için koşullu ifadelerin nasıl kullanılacağını vurgulayacağım.

Rsstail yükleyin

Bu kılavuzu takip edebilmek için RSS beslemelerini okumak için kullanılan rsstail adlı bir komut satırı uygulaması kurmanız gerekecektir.

Bir Debian / Ubuntu / Mint tabanlı dağıtım türü kullanıyorsanız aşağıdakileri yapın:

sudo apt-get yükleme rsstail

Fedora / CentOS vb için aşağıdakileri yazın:

yum rss yüklemek

OpenSUSE için aşağıdakileri yazın:

zypper rsstail yüklemek

IF beyanı

Bir terminal açın ve aşağıdakileri yazarak rssget.sh adlı bir dosya oluşturun:

sudo nano rssget.sh

Nano editörde aşağıdaki metni girin:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

CTRL ve O tuşlarına basarak dosyayı kaydedin ve sonra CTRL ve X tuşlarına basarak çıkın.

Komut dosyasını aşağıdakileri yazarak çalıştırın:

sh rssget.sh

Komut dosyası linux.about.com RSS beslemesinden bir başlık listesi döndürecektir.

Aşırı kullanışlı bir betik değildir, çünkü sadece bir RSS beslemesinden başlıkları alır ancak Linux.about.com RSS beslemesinin yolunu hatırlamak zorunda kalmaz.

Nano'daki rssget.sh komut dosyasını tekrar açın ve aşağıdaki gibi bakmak için dosyayı düzenleyin:

#! / bin / bash

eğer [1 $ = "verbose"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Aşağıdakileri yazarak komut dosyasını yeniden çalıştırın:

sh rssget.sh verbose

Bu sefer RSS beslemesi başlık, bağlantı ve açıklama ile birlikte gelir.

Betiği biraz ayrıntılı olarak analiz edelim:

Yazdığımız her komut dosyasında #! / Bin / bash görünür. Sonraki satır, temel olarak kullanıcı tarafından sağlanan ilk giriş parametresine bakar ve onu "verbose" kelimesiyle karşılaştırır. Eğer girdi parametresi ve "verbose" kelimesi, o zaman ve f arasındaki satırlarla eşleşiyorsa, koşulur.

Yukarıdaki betiğin açıkçası kusurlu. Giriş parametresi sağlamadığınızda ne olur? Cevap, beklenmedik operatör hatları boyunca bir hata olsun.

Diğer büyük kusur, "verbose" kelimesini vermezseniz, o zaman hiçbir şey olmuyor demektir. İdeal olarak, verbose kelimesini sağlamazsanız, betik başlıklar listesini döndürür.

Rssget.sh dosyasını düzenlemek ve kodu aşağıdaki gibi değiştirmek için nano'yu tekrar kullanın:

#! / bin / bash

eğer [1 $ = "verbose"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Dosyayı kaydedin ve aşağıdakileri yazarak çalıştırın:

sh rssget.sh verbose

Başlıklar, açıklamalar ve bağlantılar listesi görünecektir. Şimdi aşağıdaki gibi tekrar çalıştırın:

sh rssget.sh başlıkları

Bu sefer sadece bir başlık listesi görünür.

Komut dosyasının ekstra kısmı 4. satırda ve diğer ifadeyi içeriyor. Temelde betik şimdi ilk parametrenin "verbose" kelimesi olup olmadığını, RSS beslemesi için açıklamalar, bağlantılar ve başlıklar olup olmadığını, ancak ilk parametrenin başka bir şey varsa, yalnızca başlıkların bir listesini aldığını söyler.

Script biraz iyileşti ama hala kusurlu. Bir parametre giremezseniz yine de bir hata alırsınız. Bir parametre sağlasanız bile, sadece ayrıntılı bir şey istemediğinizi söyleyerek başlıkları istediğiniz anlamına gelmez. Örneğin, yanlış bir şekilde yanlış yazmış olabilirsiniz ya da tabiki anlamsız olan güvercinleri yazmış olabilirsiniz.

Bu sorunları denemeden önce size IF beyanı ile devam eden bir komut daha göstermek istiyorum.

Aşağıdaki gibi bakmak için rssget.sh komut dosyanızı düzenleyin:

#! / bin / bash

eğer [1 $ = "hepsi"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [1 $ = "açıklama"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Verbose kelimesinden kurtulmaya ve hepsini değiştirmeye karar verdim. Bu önemli kısım değil. Yukarıdaki senaryo, ELSE IF'i söylemenin kısa bir yolu olan elif'i tanıtıyor.

Şimdi betik şu şekilde çalışıyor. Eğer sh rssget.sh komutunu çalıştırırsanız, açıklamaları, linkleri ve başlıkları alırsınız. Bunun yerine sadece rssget.sh açıklamasını çalıştırırsanız, sadece başlıkları ve açıklamaları alırsınız. Başka bir kelime verirseniz, başlıkların bir listesini alırsınız.

Bu, koşullu ifadelerin bir listesiyle hızla ortaya çıkmanın bir yolunu sunuyor. ELIF yapmanın alternatif bir yolu, iç içe IF ifadeleri olarak bilinenleri kullanmaktır.

Aşağıda, iç içe IF deyimlerinin nasıl çalıştığını gösteren bir örnek verilmiştir:

#! / bin / bash

eğer [$ 2 = "aboutdotcom"]
sonra
eğer [1 $ = "hepsi"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [1 $ = "açıklama"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
Başka
eğer [1 $ = "hepsi"]
sonra
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [1 $ = "açıklama"]
sonra
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

İsterseniz rssget.sh dosyanıza kopyalayıp yapıştırın.

Yukarıdaki betik, bir RSS beslemesi olan "about.com" veya "lxer.com" u seçmenize izin veren bir 2. parametre sunmaktadır.

Bunu çalıştırmak için aşağıdakileri yazın:

sh rssget.sh Instagram Hesabındaki Resim ve Videoları aboutdotcom

veya

sh rssget.sh all lxer

Tabii ki sadece açıklamaları veya sadece başlıkları sağlamak için tüm açıklamaları veya başlıkları ile değiştirebilirsiniz.

Temel olarak, yukarıdaki kod, ikinci parametrenin aboutdotcom ise, ikinci parametrenin lxer olması durumunda önceki betikle aynı olan ikinci if ifadesine bakıp sonra başlıkların, açıklamaların gösterilip gösterilmeyeceğine karar vermek için iç if deyimine tekrar bakar. ya da her şey.

Bu betik tamamen iç içe geçmiş bir IF ifadesinin bir örneği olarak sunulmuştur ve bu senaryoda yanlış olan birçok şey vardır, hepsini açıklamak için başka bir makale alır. Ana konu, ölçeklendirilemez olmasıdır.

Everyday Linux User veya Linux Today gibi başka bir RSS beslemesi eklemek istediğinizi düşünün. Komut çok büyük olacak ve eğer iç IF ifadesinin değişmesini istediğinize karar verdiyseniz, bunu birden çok yerde değiştirmeniz gerekecektir.

İç içe geçmiş bir IF için bir zaman ve yer olsa da, bunlar idareli olarak kullanılmalıdır. Genellikle kodunuzu yeniden kodlamak için bir yol vardır, böylece iç içe geçmiş IF'ye ihtiyacınız yoktur. Gelecek bir makalede bu konuya geleceğim.

Şimdi, duff parametrelerine giren insanların sayısını düzeltmeye bakalım. Örneğin, yukarıdaki komut dosyasında, kullanıcı, 2. parametresi olarak "aboutdotcom" dışında bir şey girerse, kullanıcının LXER'den RSS beslemesinde, kullanıcının lxer'e girip girmediğine bakılmaksızın bir listesi görüntülenir.

Ayrıca, kullanıcı 1. parametre olarak "all" veya "description" girmezse, varsayılan, kullanıcının istediği gibi olabilen veya olmayan bir başlık listesidir.

Aşağıdaki betiğe bakın (veya kopyalayıp rssget.sh dosyanıza yapıştırın.

#! / bin / bash

eğer [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
sonra
eğer [1 $ = "hepsi"] || [1 $ = "açıklama"] || [1 $ = "başlık"]
sonra
eğer [$ 2 = "aboutdotcom"]
sonra

eğer [1 $ = "hepsi"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [1 $ = "açıklama"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
Başka
eğer [1 $ = "hepsi"]
sonra
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [1 $ = "açıklama"]
sonra
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

Unutulmaması gereken ilk şey, komut dosyasının artık oldukça büyük olması ve iç içe geçmiş IF ifadelerinin nasıl kontrol edileceğini çabucak görebilmenizdir.

Bu betikte önemli olan bit IF ifadesi || 2. satır ve 4. satırdaki THEN bölümü.

|| OR anlamına gelir. Yani satır [2 $ = "aboutdotcom"] || [$ 2 = "lxer"] , 2. parametrenin "aboutdotcom" veya "lxer" değerine eşit olup olmadığını kontrol eder. Eğer değilse, IF bildirimi tamamlanır çünkü dış IF için başka bir ifade yoktur .

Benzer şekilde 4. satırda ise [$ 1 = "all"] || [1 $ = "açıklama"] || [$ 1 = "title"] , 1. parametrenin "all" veya "description" veya "title" değerine eşit olup olmadığını kontrol eder.

Şimdi eğer kullanıcı sh rssget.sh patates peyniri çalıştırırsa, hiçbir şey iade edilmez , ancak LXER'den bir başlık listesi alırlardı.

|| & &. && operatörü AND içindir.

Senaryoyu daha çok bir kabus gibi göstereceğim ama kullanıcının 2 parametre sağladığından emin olmak için tüm önemli kontrolü yapıyor.

#! / bin / bash

eğer [$ # -eq 2]
sonra

eğer [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
sonra
eğer [1 $ = "hepsi"] || [1 $ = "açıklama"] || [1 $ = "başlık"]
sonra
eğer [$ 2 = "aboutdotcom"]
sonra

eğer [1 $ = "hepsi"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [1 $ = "açıklama"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
Başka
eğer [1 $ = "hepsi"]
sonra
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [1 $ = "açıklama"]
sonra
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
Başka
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Bu betikte ekstra olan tek bit, aşağıdaki gibi başka bir dış IF ifadesidir: [$ # -eq 2] . Eğer giriş parametreleriyle ilgili makaleyi okuyorsanız, $ # öğesinin giriş parametrelerinin sayısını döndürdüğünü bileceksiniz. -eq eşittir. Bu nedenle IF beyanı, kullanıcının 2 parametre girip girmediğini ve eğer yapmazsa bir şey yapmadan çıkıp çıkmadığını kontrol eder. (Özellikle dostça değil).

Bu öğreticinin oldukça büyük olduğunun farkındayım. Bu haftayı kapatmak için fazla bir şey yok ama bitirmeden önce senaryoyu düzeltmek istiyorum.

Koşullu ifadeler hakkında öğrenmeniz gereken son bir komut, CASE ifadesidir.

#! / bin / bash


eğer [$ # -eq 2]
sonra
durumda 2 $
aboutdotcom)
davası 1 $
herşey)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
açıklama)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
Başlık)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
LXer)
davası 1 $
herşey)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
açıklama)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
Başlık)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

Dava beyanı, ELSE IF ELSE IF ELSE IF'ye yazmanın daha güzel bir yoludur.

Örneğin bu mantık

IF meyve = muz
Sonra bu
ELSE IF meyve = portakallar
Sonra bu
ELSE IF meyve = üzüm
Sonra bu
END IF

şu şekilde yeniden yazılabilir:

içinde meyve
muz)
Bunu yap
;;
portakal)
Bunu yap
;;
üzüm)
Bunu yap
;;
esac

Temel olarak, olaydan sonraki ilk madde, karşılaştırmak istediğiniz şeydir (yani meyve). Daha sonra parantezin önündeki her bir öğe, karşılaştırdığınız şey ve eğer önceki satırlarla eşleşiyorsa; koşulacak. Bir durum ifadesi ters esac ile sona erdirilir (bu durum geriye doğrudur).

Rssget.sh komut dosyasında, vaka ifadesi, gerçekten yeterince geliştirmese de, o korkunç yuvalamadan bazılarını kaldırır.

Senaryoyu gerçekten iyileştirmek için sizi değişkenlere tanıtmam gerekiyor.

Aşağıdaki koda bakın:

#! / bin / bash

LXer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
Ekran = ""
url = ""

eğer [$ # -lt 2] || [$ # -gt 2]
sonra
echo "kullanımı: rssget.sh [tüm | açıklama | başlık] [aboutdotcom | lxer]";
çıkış;
fi

davası 1 $
herşey)
display = "- d -l -u"
;;
açıklama)
display = "- d -u"
;;
Başlık)
Ekran = "- u"
;;
esac

durumda 2 $
aboutdotcom)
url = $ aboutdotcom;
;;
LXer)
url = $ LXer;
;;
esac
rsstail $ görüntü $ url;

Bir değişken, bir isim vererek ve sonra buna bir değer atayarak tanımlanır. Yukarıdaki örnekte, değişkenler atama şöyledir:

LXer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
Ekran = ""
url = ""

Komut değişkenleri kullanarak anında daha kolay yönetilebilir. Örneğin, her parametre ayrı ayrı ele alınır ve böylece iç içe IF ifadeleri yoktur.

Ekran değişkeni, tüm, açıklama veya başlıkları seçip seçmediğinize göre ayarlanır ve url değişkeni aboutdotcom değişkeninin değerine veya lder değişkeninin değerine aboutdotcom veya lxer seçip seçmediğinize bağlı olarak ayarlanır.

Rsstail komutu, şimdi doğru şekilde çalışması için ekran ve url değerini kullanmalıdır.

Değişkenler sadece bir isim vererek belirlenirken, aslında onları kullanmak için önünüzde $ işareti koymanız gerekir. Diğer bir deyişle, değişken = değer, bir değere değişkeni ayarlarken, $ değişken araçları, değişkenin içeriğini verir.

Aşağıdaki bu dersin son senaryosudur.

#! / bin / bash

LXer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
use = "kullanım: rssget.sh [tüm | açıklama | başlık] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
Ekran = ""
url = ""

eğer [$ # -lt 2] || [$ # -gt 2]
sonra
echo $ kullanımı;
çıkış;
fi

davası 1 $
herşey)
display = "- d -l -u"
;;
açıklama)
display = "- d -u"
;;
Başlık)
Ekran = "- u"
;;
*)
echo $ kullanımı;
çıkış;
;;
esac

durumda 2 $
aboutdotcom)
url = $ aboutdotcom;
;;
LXer)
url = $ LXer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ kullanımı;
çıkış;
esac

rsstail $ görüntü $ url;

Yukarıdaki betik daha fazla RSS beslemesi getirmektedir ve kullanıcıya 2 değişken girmediğinde veya değişkenler için yanlış seçenekler girdiğinde betiğin nasıl kullanılacağını söyleyen bir kullanım değişkeni vardır.

özet

Bu epik bir yazıydı ve çok yakında çoktan gitmiş olabilir. Bir sonraki kılavuzda size IF ifadeleri için tüm karşılaştırma seçeneklerini göstereceğim ve hala değişkenlerle ilgili konuşmak için daha fazlası var.

Yukarıdaki senaryoyu geliştirmek için daha fazla şey yapılabilir ve bu, döngüleri, grepleri ve normal ifadeleri incelerken gelecekteki kılavuzlarda ele alınacaktır.

Çift önyüklemeli Windows ve Ubuntu'dan GNOME kutularını kullanarak sanal bir makine kurmaya yönelik daha yararlı kılavuzlar bulmak için l inux.about.com'un Nasıl Yapılır (kategorilerin ötesine geçerek makalelerin listesini görebilirsiniz) bölümüne göz atın.