Indekso
0. Indekso
- Aferoj, kiuj okazas al plej multaj homoj
- Strukturo de skripto
- Presi sur ekrano
- Legu uzanton INPUT
- Kalkuloj en bash
- Kondiĉoj
- Cikloj
- Funkcioj
- getops
1. Aferoj, kiuj okazas al plej multaj homoj
/ bin / bash aŭ / bin / sh
Unu el la unuaj aferoj, kiujn la maŝino faras kiam plenumas nian skripton, estas rigardi per kiu ŝelo ĝi devas fari ĝin. Ĉe plej multaj nunaj linuksaj sistemoj / bin / sh estas ligo al / bin / bash, sed ĉi tio ne ĉiam okazas, ekzemple en distribuoj kiuj uzas okupokesto ili alportas Sh kaj kutime ili ankaŭ alportas Bash, sed se vi uzas / bin / sh, ĝi ne funkcios kun Bash. Tial mi rekomendas ĉiam uzi / bin / bash.
Unikodo kontraŭ Askio
Ĉu vi iam scivolis kial vi ne povas uzi "¿" aŭ "ñ" en viaj skriptoj? Aŭ ĉu uzi supersignojn? Ĝi povas esti sufiĉe ĝena en interagaj skriptoj. Tio estas ĉar la defaŭlta kodigado de Bash estas Askio, aŭ kio estas la sama, la angla signaro. Por ŝanĝi ĝin, ni nur devas diri al nia skripto, ke ni volas uzi Unikodon. Por tio vi devas aldoni linion tuj post la komanda interpretilo:
# - * - ĈIFRADO: UTF-8 - * -
Atentu, gravas, ke ĉi tiu linio estas ĉe la komenco de la skripto.
Faru la skripton plenumebla
Estas amuze kiom da homoj administras la skriptojn per «$ bashscript.sh" anstataŭ "$ ./script.sh- Finfine, jen por kio ni difinis ŝelon.
Por aldoni ekzekutajn permesojn, vi devas plenumi:
sudo + x script.sh
BIN = "dosierujo, kie ni havas la skriptojn" PATH = "$ BIN $ PATH"
2. Strukturo de skripto
- Headboard
- Difino de tutmondaj variabloj
- Helpo
- Funkcioj
- Ĉefa korpo
La kaplinio estas kie ni indikas kiun ŝelon ni volas uzi kaj la kodigon. La avantaĝo de la funkcioj estas reuzi kodon ripetatan skribante ĝin nur unufoje kaj faciligi komprenon de la skripto, por kodo kiu superas 100 liniojn ĝi estas tre utila.
Por uzi funkciojn, ili devas esti difinitaj kun antaŭ la ĉefa korpo de nia skripto. Kaj se ni volas uzi variablojn je la tutmonda nivelo de nia tuta skripto, kaj en la ĉefa korpo kaj en la funkcioj, ni devas difini ilin komence de ĉio, tuj post la kaplinio.
Laste, estas bona praktiko skribi helpan funkcion por kiam nia skripto funkcias malbone aŭ kun malbonaj parametroj. Evidente, en tiuj kazoj ni volas forlasi la skripton tuj, sen legi la funkciojn. Por tio ni povas uzi:
function help () {echo "" "Nia bone formatita helpteksto." "" Eliru se [[-z $ 1 || $ 1 == "-h" || $ 1 == "--help"]]; tiam helpu fi
Se ni aldonas "eliri" al la helpa funkcio, ni forlasos la skripton ĉiufoje kiam ni lanĉos helpon, ekzemple post erarmesaĝoj, ktp. Ni konservas kelkajn liniojn de kodo.
La kondiĉo indikas montri helpon sur ekrano kaj eliras se la skripto funkcias sen parametroj aŭ se -h / –help estas specifita. Se vi rigardas ĝin, tio estas la norma konduto de plej multaj linuksaj programoj.
3. Presi sur ekrano
Estas 2 ĉefaj komandoj por presi al ekrano en bash: «eĥo"Kaj"printf«. Ili ambaŭ estas same rapidaj kaj ambaŭ estas parto de bash. La ĉefa diferenco por komencanto estas, ke eoo aldonas novan linion fine, dum «printf»Ne.
Echoo bonas kaj estas tio, kion plej multaj homoj uzas, tamen legante la ENIGON de la uzanto, aŭ kiam vi volas presi variablojn prenitajn el dosieroj per tekstoprilaborado, strangaj aferoj povas okazi. Ili kutime facile solveblas, same facile kiel ŝanĝi la duoblajn citilojn al unuopaj aŭ inverse, aŭ forigi la variajn referencojn el la citiloj. «eĥo»Ĝi faras strangajn aferojn ankaŭ depende de kiel ĝi estis kompilita, se ni ĉiam uzas Ubuntu aŭ ĉiam Fedora, ĝi ne influas nin, sed se ni ŝanĝas la distribuon, jes.
Tial mi uzas «printf«, Kiu ne donas al mi kapdolorojn kaj ankaŭ kondutas pli kiel«printf»De C aŭ la«presaĵo»De Python, tio estas tre grava se vi iam volas porti vian skripton al alia programlingvo.
4. Legu uzanton INPUT
Ĉio, kion ni skribas post la nomo de nia skripto kaj antaŭ ol premi la klavon ENTER, estas aŭtomate konservita en specialaj variabloj. Ĉi tiuj variabloj estas de la tipo $ X kie X estas nombro.
«$0»Indikas la nomon de nia skripto kaj de«$1»Ĝis senfineco ĉio, kion ni skribis poste, estas ŝanĝiĝema. Ekzemple:
kato << EOF >> test.sh #! / bin / bash # - * - KODIGADO: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n" EOF chmod + x script.sh ./script.sh my file.txt
Ni kreas testan skripton, igas ĝin plenumebla kaj lanĉas ĝin per 2 parametroj. Ni akiras la ekranan rezulton de:
$ 0 = ./script.sh $ 1 = mia $ 2 = file.txt
Uzante citaĵojn ni povus transdoni "mian dosieron.txt" al "$ 1".
Ni ankaŭ povas legi la ENIGON de uzanto per la komando "legi", rekte indikante la variablon, kie ni volas konservi la parametron. Ekzemple:
printf "Kiel vi nomiĝas? \ n" legu NAME printf "Saluton, $ NAME. \ n"
5. Kalkuloj en Bash
Por tio ni povas uzi «ekspr«, Se ni ne bezonas fari kompleksajn kalkulojn. Notindas du aferoj, la unua estas ke «ekspr»Nur akceptas tutajn nombrojn, la dua estas, ke la divido redonas la tutan rezulton, por vidi la reston ni povas uzi«%".
Kutime ni volos atribui la rezulton de expr al variablo. Ni povas fari tion per du manieroj:
VAR2 = "ekspr $ VAR1 / 10` VAR2 = $ (ekspr $ VAR1 / 100)
Vi ankaŭ povas preterlasi «ekspr»Uzi duoblajn krampojn:
VAR2 = $ (($ VAR1 / 100))
6 Kondiĉoj
Ĝi jam longe skribis pri «if","alia","elif»Kaj kondiĉoj. Vi povas legi pri tio en:
- Programado en bash: parto 1
- Bash: se, tiam, alie kondiĉoj
- Kontrolu ĉu dosiero aŭ dosierujo ekzistas aŭ ne kaj pli kun se-buklo
- Programado en bash: parto 2
Mi nur volas reliefigi la diferencon inter la uzo de simplaj kvadrataj krampoj, «[]«, Kaj duoblaj krampoj,«[[]]«, Por la kondiĉoj. Kun duoblaj krampoj ni povas uzi aldonajn kondiĉojn:
- «&&»Por kaj
- «||»Por aŭ
Uzi "&&"Kaj"||»Kun simplaj kvadrataj krampoj, ĉiu parto estu disigita en apartaj kvadrataj krampoj. La ekzemplo uzata por la parto de la skripto, kiu aspektas, ĉu helpo devas esti plenumita, estus:
se [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--help"]]; tiam helpu fi
Ĝi ankaŭ savas nin devi skribi variajn nomojn inter citiloj por eviti erarojn. Ekzemple:
se [$ 1 = 1]; tiam printf "La parametro egalas al 1."; fi se ["$ 1" = 1]; tiam printf "La parametro egalas al 1."; fi se [[$ 1 = 1]]; tiam printf "La parametro egalas al 1."; fi
Se script.sh ruliĝas sen iuj parametroj, la unua kazo donus eraron:
bash: [: =: unaria operatoro atendita
Pri kio oni ne parolis estas «kazo«, Uzata por simpligi«if«. Ni komencu komence, kiam ni ne havas «if»Ĉiu kodo estos ekzekutita. Se ni aldonas kondiĉon «if»Ni havos du kazojn, unu en kiu la kodo-bloko kiu estas ene de la«if»Kaj la alia kazo, kie ĉi tiu bloko ne estas ekzekutita.
Se ni aldonas «alia«Ni ankaŭ havos du kazojn, sed ĉi tiuj du kazoj diferencas de la antaŭaj. Ĉar nun estos du kondiĉaj kodaj blokoj, A kaj B, kaj C-bloko, kiu estas la resto de la programo. A aŭ B estos ekzekutita, kaj C. En la antaŭa kazo ĝi estis A kaj C aŭ nur C.
Por eviti skribajn kondiĉojn «se / alie"ene"alia»Kaj por simpligi la legadon de la kodo, ĝi estis kreita«elif«. Kiam ni havas multajn kondiĉojn, kiuj dependas de la antaŭa, ekzemple gamo de nombroj aŭ la tipo:
VAR1 = $ 1 se [[$ VAR1 = 1]]; tiam printf "1 \ n" elif [[$ VAR1 = 2]]; tiam printf "2 \ n" elif [[$ VAR1 = 3]]; tiam printf "3 \ n" else printf "neniu \ n" fi
En la kazo de la lasta «elif»Multaj kondiĉoj estos legitaj. Kun kazo ĉi tiu procezo estas simpligita:
VAR1 = $ 1-kazo $ VAR en 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 aŭ 4, ĝi dependas \ n" ;; *) printf "neniu \ n" ;; ke C
Variablo estos legata, ĉi-kaze VAR1, kaj ĝi estos kontrolita, ĉu ĝi ekvivalentas al iuj el la kazoj, se ne, la defaŭlta kazo "*" estos plenumita. Duoblaj punktokomoj samvaloras kiel «paŭzo«, Ili diras«kazo»Tio devas finiĝi.
7. Cikloj
Tre malmultaj bukloj estas konataj en iu ajn programlingvo. En Bash ili estas «dum","ĝis"Kaj"por«. Ĝi jam estis skribita en la blogo pri ĉi tiuj:
Estas du specoj de bukloj «por«, Tiuj, kiuj estas de la tipo«$ por VAR en LOQUESEA»Kaj kio estas de tipo C«$ por ((I = 0; I <= 10; I ++))«. La dua speco de bukloj «por»Estas tre utilaj, ĝi havas 3 partojn komence de la buklo:
- Deklaro kaj ekigo de variabloj (Ĉi-kaze helpa variablo "I = 0").
- Ekzekuta kondiĉo (ĝis I estas malpli ol aŭ egala al 10).
- Pliiĝo de la helpa variablo
Laŭ mi ĝi estas la plej potenca buklo el ĉiuj. Ekzemplo, kiu presas ĉiujn nombrojn de 0 al 10, inkluzive:
#! / bin / bash for ((I = 0; I <= 10; I ++)); ĉu printf "$ mi \ n" finiĝis
8. Funkcioj
Estas iuj aferoj, kiujn Bash ne permesas al ni fari, ĉu ne? Unuavide, bash-funkcioj malebligas vin fari 3 aferojn: deklari lokajn variablojn en funkcioj, transdoni parametrojn al funkcioj kaj redoni parametrojn. Ĉio havas solvon.
Faru nenion kiel:
#! / bin / bash VAR = 1 printc "$ VAR \ n" funkcio saluton () {VAR = 2 printf "$ VAR \ n"} saluton printf "$ VAR \ n"
Ĉi tio presas al ekrano 1, 2 kaj 2.
Por deklari lokajn variablojn, aldonu «lokaj»Kiam oni deklaras:
#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funkcio foo () {loka VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Ĉi tio presas 1, 1, 2, 1 sur ekrano.
Kiel vi pasigas parametrojn al funkcio?
#! / bin / bash # - * - KODIGADO: UTF-8 - * - funkcio saluton () {printf "Saluton $ 1 \ n"}
printf "Kiel vi nomiĝas? \ n"
legu VAR1
saluton $ VAR1
Kiel parametroj estas redonitaj?
#! / bin / bash # - * - KODIGADO: UTF-8 - * - funkcio saluton () {printf "Saluton holita"} printf "Kiel vi nomiĝas? \ n" legu VAR1 VAR1 = $ (saluton) # TIE ĜI ESTAS printf "$ VAR1 $ VAR2 \ n"
Kiel vi vidas, ĉi tio havas du malavantaĝojn, vi povas nur redoni unu parametron, kiu povas esti vektoro 😀, kaj se vi volas redoni parametron, vi ne plu povas presi sur la ekrano de tiu funkcio.
9. Getops
Unu el la lastaj aferoj, kiujn vi bezonas scii pri Bash por krei kompleksajn skriptojn, estas «getops«. Ĝi estas uzata por pasigi eblojn al la skripto sendepende de la ordo. La sola malavantaĝo estas, ke ĝi influas nur mallongajn eblojn:
#! / bin / bash # - * - KODIGADO: UTF-8 - * - VARC = 0 funkcio helpo () {printf "Helpa mesaĝo \ n" eliri} se [[-z $ 1]]; tiam helpu fi dum getopts: ha: b: c OPT; ĉu $ OPT en h) helpas ;; :) helpo ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) helpo ;; esac farita # Ĉefa bloko de la skripto, kiu # faras aferojn kun VARA, VARB kaj VARC
«getopts»Legas la eblojn unu post la alia, do necesas buklo.
Estas 2 specoj de ebloj preterpaseblaj per «getopts":
- Parametroj nomataj flagoj, ĉi-okaze -c aŭ -h. Ili estas specifitaj per la litero, kiun ni volas uzi. Ili estas kiel buleaj variabloj, «veraj»(Ĉu) aŭ«falsa"(Ili ne estas ĉi tie).
- Parametroj kun asociitaj argumentoj, -a io ajn, -b io ajn. Ili estas specifitaj per la litero, kiun ni volas per dupunkto sube. La argumento estas konservita en OPTARG (ĉi tiu nomo estas neŝanĝebla).
Kion faras ĉi tiu skripto?
Montras la helpan mesaĝon kiam neniu opcio estas pasigita, kiam la parametro "-h" estas pasita, kiam nevalida parametro estas pasita (ekzemple "-x", ĉi tio estas farita per "\?") Aŭ kiam valida parametro kun neniu argumento (":"). En la resto de la kazoj ĝi ŝparas la ĉeeston de "-c" kiel 1 en VARC, kaj la valorojn pasitajn per "-a" kaj "-b" en VARA kaj VARB.
20 komentoj, lasu la viajn
MASTERE. Mi ne diras pli U_U
Saluton, tre bona artikolo.
Hej vi metis doni permesojn sudo + x anstataŭ chmod + x
$ sudo chmod + x script.sh
(Por esti pli ĝusta, hehe)
Ha, gratulon kaj dankon!
Tre bona afiŝo, mi vere gratulas vin, daŭrigu tiel, Salutojn
Kaj se vi volas, ke la skripto estu videbla kiam ĝi estas plenumita, paŝon post paŝo, vidante ekzemple kiel kondutas variabloj, kondiĉoj kaj ĉio, vi povas uzi:
sh -x-skripto
salutoj
PECO de kuratoreco. Bonega kaj tre bone klarigita.
Dankon.
Bonega afiŝo pri la temo 😉
Tre interesa kaj grava, dankon pro la informo ....
KURAJ !!!
Dankon al ĉiuj pro viaj gratuloj, ĉar por la komando Miguel, li ne lasas min modifi la eniron post kiam ĝi estos publikigita. Ĝi devos fari elav mi imagas.
Tre bona!
Unue mi volis gratuli vin pro la afiŝo, mi trovis ĝin facile komprenebla kaj vere helpas sekvi la gvidliniojn por bone programi en bash, precipe por homoj, kiuj komencas programi.
Tamen mi trovis kelkajn detalojn, kiujn mi opinias korektindaj.
Unue: en sekcio «2. STRUTURO DE SKRIBLO »la funkcio ne estas fermita, kio kaŭzos problemojn dum plenumado de ĝi en skripto.
La solvo estus aldoni ferman krampon al ĝi tuj post la komando "eliri".
Due: en sekcio «4. READ THE USER INPUT ”vi asertas, ke la parametroj, kiujn la uzanto povas enigi, varias de $ 0 ĝis senfineco, tamen“ bash ”nur interpretos de $ 0 ĝis $ 9, ĉar $ 10 egalus al $ 1 + 0.
Por solvi ĉi tiun problemon, vi povus uzi la komandon "shift" por ekpreni la jenajn variablojn. Aŭ specifi la variablon inter krampoj "$ {10}", por ke bash kunprenu la valorojn, ne kiel $ 1 + 0.
Sen plue, salutojn!
Dankon pro via komento. Ĝi tute malsukcesis klarigi la ĝustan uzon de eliro, kaj en la skripto kaj en la funkcioj. Pri $ {10} mi neniam testamentis tiom multe, do mi ne trafis tiun problemon, estas bone scii, ke ekzistas solvo por tio (mi jam forstrekis la novan lernitan hodiaŭ 😀).
Koran dankon pro la artikolo! Iuj el la aferoj, kiujn vi mencias, mi bezonis klarigi. Ekzemple, getops.
En la parto de ekranaj rezultoj, vi devis mencii la katon, kiun vi poste mencias ...
kato <
****************************************
* ĈI TIU FORMO ESTAS TRE ESPRIMA *
****************************************
EOF
En via ekzemplo:
kato << EOF >> test.sh
Du aferoj devas esti menciitaj ... >> ĝi estas 'aldonu' tio estas, se vi ripetas la saman ordonon, vi havos la tutan skripton en duplikato ... Vi devas uzi nur unu ...
kato << EOF> skripto.sh
Jes, ĝi ankaŭ nomiĝu script.sh
Poste en
se [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–help"]]; tiam
helpi
fi
Mi pensas, ke ĝi estu skribita ...
se [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–help"]]; tiam
...
Estas multe pli por malkovri de BASH.
Ĉu vi povus titoli ĝin "BASICS"? 🙂
Ekzemple, parametro 'testers' ŝatas -z por vidi ĉu ili estas malplenaj, aŭ -f por vidi ĉu ĝi ekzistas kiel dosiero.
Denove dankon pro via penado.
alberto
Tre bona lernilo pri bash-skripto!
-- ĈIFRADO: UTF-8 --
Estas la unua fojo, ke mi vidas tiun linion agordi signokodadon en bash-skripto. Ŝajnas al mi pli kiel Python ol Bash. Ĉu vere necesas? Mi serĉis referencon ĉe Google, sed mi trovas nenion, ĉu vi havas ligilon sub la mano, kiu parolas pri ĉi tiu afero? Specife pri la taŭgeco de tiu linio.
Miaopinie, por skribi skriptojn en Bash per UTF-8, vi nur bezonas konservi la tekstdosieron kiel tian (sen nomumo) kaj havi iujn ĉirkaŭajn variablojn, (LANG kaj LC_ *), ĝuste agorditajn.
Tiam, evidente, necesas, ke la plenumitaj komandoj estu pretaj por kodoj krom ASCII. Ekzemple, se ni volas transformi al majuskloj, ĉi tio ne ŝajnas funkcii:
«Echoo áéíóú | tr az AZ »
o:
«Echoo áéíóú | tr [: malsupra:] [: supra:] »
kaj estas pli bone uzi:
«Echoo áéíóú | awk '{print toupper ($ 0)}' ».
Ĉirkaŭ la "kodoprezento»Estis menciita en ĉi tiu blogo antaŭe:
Bash: kiel igi skripton plenumebla
Afiŝu instalan utilan skripton
Iu korektas min, sed tiu koda linio (# -- ĈIFRADO: UTF-8 --) Ĝi neniel rilatas al bash aŭ la ŝelo: ĝi estas komenta linio (komenciĝas per #) kaj servas por diri al la REDAKCIO, ke ni uzas por skribi la skripton (vim, emacs ...) la kodigon de la dosiero.
Fakte bash ne vidas tian linion, ĉar ĝi estas komenta linio.
Bonega lernilo, ĉar Sysadmin scii Skriptadon en Bash estas esenca, ĝi utilas por ĉio.
Tre tre bona!
Dankon!
Se ĝi utilas al iu, jen kelkaj uzoj kaj ekzemploj por krei viajn proprajn Skriptojn: https://github.com/reduardo7/hsabx
Tre bona. Novaj aferoj aldoneblaj al miaj skriptoj. La koda afero kaj la printf-aĵo ne havis ĝin.
Dankon!!!
Tiel bona bona artikolo! Mi konservas ĉi tiun por plej ŝatataj, estus bone korekti kio estas malĝusta kaj eĉ plivastigi ĝin per pli da enhavo. Aplaŭdon por ĉiuj ĉi tiuj informoj !!!!