Yeni Başlayanlar Kılavuzu - Şərtlər və Dəyişənlər

Giriş

"Başlanğıc Kılavuzu BASH" üçüncü hissəsinə xoş gəlmisiniz. Əvvəlki iki məqaləni qaçırdıysanız, yəqin ki, bu təlimatın digər BAS scripting təlimatlarına fərqli olduğunu bilmək istərdiniz.

Bu təlimat BASH-a tam bir təcrübəsiz yazılır və öyrəndiyim bir oxucu olaraq öyrənir. Mən yazdığım şeylərin əksəriyyəti Windows platforması üçün olmuşdur baxmayaraq BASH üçün bir təcrübəsidir baxmayaraq bir proqram inkişaf fonunda gəlmək.

İlk iki təlimatı ziyarət edərək bilərsiniz:

BAS scripting üçün yeni varsa, bu ilə davam etməzdən əvvəl ilk iki təlimatlar oxumaq gəlir.

Bu təlimatda istifadəçi girişini sınamaq və bir funksiya necə işlədiyini nəzarət etmək üçün şərti ifadələrin necə istifadə ediləcəyini vurğulamaq olar.

Rsstail qurun

Bu təlimatı izləmək üçün RSS feeds oxumaq üçün istifadə olunan rsstail adlı bir komanda sifarişi tətbiqini yükləməlisiniz.

Bir Debian / Ubuntu / Mint əsaslı distribution növü istifadə edirsinizsə:

sudo apt-get install rsstail

Fedora / CentOS və s. Üçün aşağıdakıları yazın:

yum yüklemek rsstail

OpenSUSE üçün aşağıdakıları yazın:

zypper yüklemek rsstail

IF bəyanatı

Terminalı açın və aşağıdakıları yazaraq rssget.sh adlı bir fayl yaradın:

sudo nano rssget.sh

Nano redaktoru daxilində aşağıdakı mətni daxil edin:

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

Faylı CTRL və O düymələrinə basaraq saxlaya bilərsiniz və sonra CTRL və X-ə basın.

Aşağıdakıları yazaraq skriptə başla:

sh rssget.sh

Skript, linux.about.com RSS feed'dən başlıqların siyahısını qaytaracaq.

Yalnız bir RSS feed'dən adları alır, ancaq Linux.about.com RSS feed'inin yolunu yadda saxlamaqdan xilas olduğundan, çox faydalı bir skript deyil.

Nano-da rssget.sh skriptini yenidən açın və faylları aşağıdakı kimi baxın:

#! / bin / bash

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

Aşağıdakıları yazaraq skriptə yenidən başladın:

sh rssget.sh verbose

Bu dəfə RSS feed başlığı, keçid və təsviri ilə geri gəlir.

Ssenari bir qədər ətraflı təhlil edək:

Yazdığımız hər bir skriptdə #! / Bin / bash görünür. Növbəti xətt əsasən istifadəçi tərəfindən verilən ilk giriş parametrinə baxır və "verbose" sözü ilə müqayisə edilir. Girdi parametri və "verbose" sözü, o zamanlar arasındakı xəttlərə uyğun gəlir və fi qaçır.

Yuxarıdakı ssenarisi açıq-aşkar qüsurlu idi. Bir giriş parametrini verməsəniz nə olar? Cavab gözlənilməz operatorun xətləri boyunca bir səhv alırsınız.

Digər böyük qüsur isə "söz" sözünü vermirsinizsə, heç bir şey olmayacaqdır. İdeal halda, sözdəki sözü verdiyiniz halda, skript kitabın bir siyahısını geri verərdi.

Rssget.sh faylını redaktə etmək üçün kodu yenidən istifadə edin və aşağıdakı kodu dəyişin:

#! / bin / bash

əgər [$ 1 = "verbose"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
başqa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Dosyayı qeyd edin və aşağıdakıları yazaraq işə salın:

sh rssget.sh verbose

Başlıqların, təsvirlərin və linklərin siyahısı görünəcək. İndi yenidən işləyin:

sh rssget.sh adları

Bu dəfə adların yalnız bir siyahısı görünür.

Skriptin əlavə hissəsi 4-cü satırdadır və başqa ifadəni təqdim edir. Əsasən skript indi ilk parametrenin "verbose" sözü olub olmadığını deyirsə RSS feed'inin təsviri, keçidləri və adları alsın, amma birinci parametr başqa bir şeydirsə, yalnız başlıqların siyahısını əldə edin.

Ssenarisi bir qədər yaxşılaşmışdır, lakin hələ də səhvdir. Bir parametrenin girilməməsi halında bir səhv alacaqsınız. Bir parametri təmin etsəniz belə, yalnız verb istəmirsiniz deyirsiniz, yalnız adların istədiyi demək deyil. Məsələn, yalnız misal üçün yanlış yazılmış ola bilər və ya, əlbəttə, mənasız olan göyərçinlər yaza bilərsiniz.

Bu məsələləri sınamadan və təmizləməzdən əvvəl sizə IF bəyannaməsi ilə gedən bir daha əmri göstərmək istərdim.

Rssget.sh skriptinizi aşağıdakı kimi baxın:

#! / bin / bash

əgər [$ 1 = "hamısı"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "təsvir"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Sözün sözündən qurtulmaq qərarına gəldim və onu əvəz etdim. Bu vacib bir hissəsidir. Yuxarıda verilmiş ssenarilər ELF if IF sözünün qısa yoludur.

İndi script aşağıdakı kimi işləyir. Əgər rssget.sh-ni işləsəniz, o zaman təsvirləri, keçidləri və adları əldə edirsiniz. Bunun əvəzinə yalnız rssget.sh təsviri ilə işləsəniz, adları və təsvirləri alacaqsınız . Başqa sözlə danışırsınızsa, başlıqların siyahısını əldə edəcəksiniz.

Bu, şərti ifadələrin siyahısı ilə tezliklə gəlmənin bir yolunu təqdim edir. ELİF-in alternativ bir üsulu iç içə IF ifadələri kimi tanınanları istifadə etməkdir.

Aşağıdakı ifadələr iç içə IF ifadələrinin necə işlədiyini göstərən bir nümunədir:

#! / bin / bash

əgər [$ 2 = "təxminən"]
sonra
əgər [$ 1 = "hamısı"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "təsvir"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

başqa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
başqa
əgər [$ 1 = "hamısı"]
sonra
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "təsvir"]
sonra
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
başqa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

İstədiyiniz hər şeyi yazın və ya kopyalayıb rssget.sh faylına yapışdırın.

Yuxarıdakı skript, "about.com" və ya "lxer.com" a bir RSS feed seçməyinizi təmin edən 2 parametr təqdim edir.

Bunu çalıştırmak üçün aşağıdakıları yazın:

sh rssget.sh bütün haqqındadotcom

və ya

sh rssget.sh bütün lxer

Şübhəsiz ki, hamısı açıqlamalar və ya yalnız başlıqları təmin etmək üçün bütün təsvirləri və ya başlıqları əvəz edə bilərsiniz.

Əsasən yuxarıda göstərilən kod deyir ki, əgər ikinci parametr ondotkom olsa, ikinci parametr lxer isə əvvəlki scriptdən eyni olan ikinci if ifadəsinə baxarsa, başlıqları, təsviri və ya hər şey.

Bu skript tamamilə iç içə bir IF ifadəsinin bir nümunəsi kimi verilir və bu script ilə yanlış bir çox şey var, bunları hamısını izah etmək üçün başqa bir məqalə edərdi. Əsas məsələ odur ki, ölçülü deyil.

Gündəlik Linux İstifadəçiləri və ya Linux Günü kimi bir başqa RSS feed əlavə etmək istərdinizmi? Ssenarisi böyük olardı və dəyişiklik üçün daxili IF bəyannaməsini istəməyinizə qərar verərsənsə, onu bir çox yerlərdə dəyişdirməlisiniz.

Daxili bir IF üçün vaxt və yer olsa da, az istifadə edilməlidir. Ümumiyyətlə, iç içə keçməmisinizsə, kodunuzu refactor etmək üçün bir yol var. Mən gələcək məqalədə bu mövzuda gələcəyəm.

İndi duff parametrlərinə daxil olan insanların məsələsini təyin edək. Məsələn, əgər istifadəçi "2d parametr" kimi bir şey "indotcom" dan başqa bir şeyə girərsə yuxarıdakı skriptdə LXER-dən olan RSS-lərdən bir istifadəçi daxil olub-olmamasına baxmayaraq, bir məqalə siyahısı görünür.

Bundan əlavə, istifadəçi "bütün" və ya "təsvir" parametrini 1-ci parametrə daxil etmədikdə, u mənim, istifadəçinin nəyi nəzərdə tutan və olmaya biləcək başlıqların siyahısıdır.

Aşağıdakı skriptə baxın (və ya kopyalayıb rssget.sh faylına yapışdırın.

#! / bin / bash

əgər [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
sonra
əgər [$ 1 = "hamısı"] || [$ 1 = "təsviri"] || [$ 1 = "başlıq"]
sonra
əgər [$ 2 = "təxminən"]
sonra

əgər [$ 1 = "hamısı"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "təsvir"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

başqa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
başqa
əgər [$ 1 = "hamısı"]
sonra
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "təsvir"]
sonra
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
başqa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

Qeyd etmək lazım olan ilk şey, scriptin artıq ədalətli olmağından ibarətdir və IF-lərin içindəki ifadələrin necə idarə edilə biləcəyini tez bir zamanda görə bilərsiniz.

Bu skriptdə vacib olan bit, IF ifasıdır || Xətti 2-də və 4-də THEN hissəsi.

| | | OR deyir. Belə ki, xətt [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] 2 parametrenin "aboutdotcom" və ya "lxer" e bərabər olub olmadığını yoxlayır. Əgər bu deyilsə, əgər IF ifası tamamlanırsa, ən çox IF üçün heç bir başqa bir bəyanat yoxdur .

Eynilə 4 satırda [$ 1 = "bütün"] || [$ 1 = "təsviri"] || [$ 1 = "title"] 1-ci parametrenin "bütün" və ya "təsvir" və ya "başlıq" ya bərabər olub olmadığını yoxlayır.

İndi istifadəçi rssget.sh kartof pendirlə çalışırsa, LXER-dən başlıqların siyahısını almasından əvvəl heç bir şey qaytarılmır.

| | && edir. AND & operator, AND üçün dayanır.

Ssenariyi daha çox bir kabus kimi görünməyə hazırlaşıram amma istifadəçi 2 parametr təmin etdiyinə əmin olmaq üçün bütün vacib yoxlamaları edir.

#! / bin / bash

əgər [$ # -qq 2]
sonra

əgər [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
sonra
əgər [$ 1 = "hamısı"] || [$ 1 = "təsviri"] || [$ 1 = "başlıq"]
sonra
əgər [$ 2 = "təxminən"]
sonra

əgər [$ 1 = "hamısı"]
sonra
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "təsvir"]
sonra
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

başqa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
başqa
əgər [$ 1 = "hamısı"]
sonra
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "təsvir"]
sonra
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
başqa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Ssenaridə əlavə olan yeganə bit başqa bir IF ifasıdır : əgər [$ # -qq 2] . Giriş parametrləri ilə bağlı məqaləni oxuyursunuzsa, $ $ # giriş parametrlərinin sayını geri qaytaracağını biləcəksiniz. -Eq bərabərdir. Buna görə IF bildirimi istifadəçinin 2 parametrə daxil etdiyini yoxlayırsa və yalnız bir şey etmədən çıxarsa yoxlayır. (Xüsusilə dost deyil).

Bu təlimçinin olduqca böyük olduğunu bilirəm. Bu həftə əhatə etmək üçün daha çox bir şey yoxdur, amma bitməzdən əvvəl ssenarini düzəltməyə kömək etmək istəyirəm.

Şərti bəyanatları öyrənmək üçün lazım olan bir son əmr CASE ifadəsidir.

#! / bin / bash


əgər [$ # -qq 2]
sonra
vəziyyətdə 2 dollar
aboutdotcom)
vəziyyətdə 1 dollar
hamısı)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
təsvir)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
başlıq)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
vəziyyətdə 1 dollar
hamısı)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
təsvir)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
başlıq)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

İddia bülleteni ELSE if IF ELSE IF IF IF yazmağın daha gözəl bir yoludur.

Məsələn bu məntiq

Yemək = banan
Bundan sonra bu
ELSE IF meyvə = portağal
Bundan sonra bu
ELSE IF meyvə = üzüm
Bundan sonra bu
END IF

kimi yenidən yaza bilərsiniz:

vəziyyət meyvəsi
banan)
bunu et
;;
portağal)
bunu et
;;
üzüm)
bunu et
;;
esac

Əsasən işdən sonra ilk maddə müqayisə edəcəyiniz şeydir (yəni meyvə). Mötərizə qarşısında hər bir maddə qarşı müqayisə etdiyiniz şeydir və əgər əvvəlki xəttlərə uyğun gəlsə; qaçacaq. Bir iddia bəyanatı tərs esac (bu halda geriyə) ilə ləğv edilir.

Rssget.sh skriptində iddianın bəyanatı həqiqətən kifayət qədər yaxşılaşdırılmasa da, bu dəhşətli yuvanın bir qismini qaldırır.

Ssenariyi həqiqətən yaxşılaşdırmaq üçün dəyişənlərə tanış olmalıyam.

Aşağıdakı kodu baxın:

#! / bin / bash

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

əgər [$ # -lt 2] || [$ # -gt 2]
sonra
echo "istifadə: rssget.sh [bütün | təsvir] başlığı [aboutdotcom | lxer]";
çıxış;
fi

vəziyyətdə 1 dollar
hamısı)
display = "- d -l -u"
;;
təsvir)
display = "- d -u"
;;
başlıq)
display = "- u"
;;
esac

vəziyyətdə 2 dollar
aboutdotcom)
url = $ fordotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ display $ url;

Bir dəyişən bir ad verilməsi və sonra dəyər verilməsi ilə müəyyən edilir. Yuxarıda göstərilən nümunədə aşağıdakı dəyişən tapşırıqlar verilmişdir:

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

Skript, dəyişənləri istifadə edərək dərhal daha idarə edilə bilər. Məsələn, hər bir parametr ayrı-ayrılıqda işlənir və beləliklə, iç içə IF ifadələri yoxdur.

Ekran dəyişənliyi, bütününü, təsviri və ya başlığı seçdiyinizə və seçdiyinizə görə təyin olunur və url dəyişən təxminən dəyişən dəyişən dəyərinə və ya lxer dəyişəninin dəyərinə təyin olunur.

Rsstail komandası indi düzgün işləməsi üçün ekran və url dəyərini istifadə etməlidir.

Değişkenler yalnız bir ad vererek ayarlanırken, aslında bunları kullanmak üçün önünüzde bir $ işareti qoymalısınız. Başqa sözlə, dəyişən = dəyər dəyişənə dəyər verir, dəyişən isə dəyişənin məzmununu verir.

Aşağıdakı bu təlimat üçün son skriptdir.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
herdaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
istifadə = "istifadə: rssget.sh [bütün | təsvir] başlıq [lxer | fordotcom | hər günlinuxuser | linuxtoday]"
display = ""
url = ""

əgər [$ # -lt 2] || [$ # -gt 2]
sonra
echo $ istifadə;
çıxış;
fi

vəziyyətdə 1 dollar
hamısı)
display = "- d -l -u"
;;
təsvir)
display = "- d -u"
;;
başlıq)
display = "- u"
;;
*)
echo $ istifadə;
çıxış;
;;
esac

vəziyyətdə 2 dollar
aboutdotcom)
url = $ fordotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
herdaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ istifadə;
çıxış;
esac

rsstail $ display $ url;

Yuxarıdakı script daha çox RSS rəyini təqdim edir və istifadəçi dəyişənlərin yanlış variantlarını daxil etmədikdə və ya iki dəyişənə daxil olmadıqda, istifadəçi dəyişən var.

Xülasə

Bu epik məqalə olmuşdur və çox tezliklə çoxdan getmiş ola bilərdi. Növbəti təlimatda mən IF ifadələrinə dair bütün müqayisəli variantları göstərəcəyəm və dəyişkənlərə dair danışmaq üçün hələ də çox şey var.

Yukarıdakı skripti inkişaf etdirmək üçün daha çox işlər görülə bilər və bu loops, grep və müntəzəm ifadələr araşdırmaq kimi gələcək təlimatlar əhatə olunacaq.

GNOME qutularını istifadə edərək, virtual maşın qurmaq üçün Windows və Ubuntu- nun ikili önyüklənməsindən daha çox faydalı təlimatlar tapmaq üçün l inux.about.com-un necə bölməsinə (məqalələrin siyahısını görmək üçün keçmiş aşağıya keçmək) baxın.