In ons laatste artikel hebben we enkele eenvoudig te gebruiken trucs besproken om eenvoudige maar nuttige shellscripts te maken. Nu duiken we wat meer in en voegen wat intelligentie toe.

Conditionals gebruiken

Als je het script herinnert dat we de vorige keer schreven, bevatte het een reeks opdrachten waarmee Pandoc vier versies van een Markdown-document kon genereren (in elk van HTML, DOCX, ODT en ePub). Maar dit was alles of niets ... of we gebruikten Pandoc zelf om ze een voor een te maken, of allemaal. Wat als we wilden kiezen en kiezen?

Dit is eenvoudig met Conditionals, die in feite zijn " als X dit is, doe dit dan " -verklaringen. Laten we het script eens bekijken zoals wij het hadden:

 #! / bin / bash pandoc -r markdown -w html -o $ 1.html $ 1 && pandoc -r markdown -w docx -o $ 1.docx $ 1 && pandoc -r markdown -w odt -o $ 1.odt $ 1 && pandoc - r markdown -w epub -o $ 1.epub $ 1 

Stel dat we een van de bovenstaande items op de opdrachtregel kunnen kiezen, of allemaal. Een snelle aanpassing aan het pandoc-pub.sh- script, zoals dit, zal precies dat bereiken:

 #! / bin / bash file = $ 1 export = $ 2 if ["$ export" == "html"] dan pandoc -r markdown -w html -o $ file.html $ file elif ["$ export" == "docx "] dan pandoc -r markdown -w docx -o $ file.docx $ file elif [" $ export "==" odt "] dan pandoc -r markdown -w odt -o $ file.odt $ file elif [" $ exporteer "==" epub "] dan pandoc -r markdown -w epub -o $ file.epub $ file fi 

Het eerste dat we hier hebben gedaan, is de twee variabelen die we willen geven uit de opdrachtregelnamen: bestand (het bronbestand van Markdown) en exporteren (wat het formaat is waarnaar we willen exporteren. Dus nu kunnen we kiezen en kiezen wat we willen genereren met behulp van:

 pandoc-pub.sh [bestand dat u wilt converteren] .md [een van beide "html, " "docx, " "odt, " of "epub"] 

Maar hoe zit het met de hele kreng? Dat zouden we de vorige keer kunnen doen, maar nu niet? Welnu, als we een beetje vooruit denken, moeten we rekening houden met een geval waarin we (of een andere gebruiker) iets invoeren naast de vier bovenstaande keuzes - in dit geval waarom niet alles exporteren? Voeg als volgt nog een stukje code toe:

 #! / bin / bash file = $ 1 export = $ 2 if ["$ export" == "html"] dan pandoc -r markdown -w html -o $ file.html $ file elif ["$ export" == "docx "] dan pandoc -r markdown -w docx -o $ file.docx $ file elif [" $ export "==" odt "] dan pandoc -r markdown -w odt -o $ file.odt $ file elif [" $ exporteer "==" epub "] dan pandoc -r markdown -w epub -o $ file.epub $ file else pandoc -r markdown -w html -o $ file.html $ file && pandoc -r markdown -w docx -o $ file.docx $ file && pandoc -r markdown -w odt -o $ file.odt $ file && pandoc -r markdown -w epub -o $ file.epub $ file fi 

Nu, als we niets na de bestandsnaam invoeren op de opdrachtregel (of het verkeerde ding), zal dit script gewoon het veilige ding doen en alle formaten genereren.

Een GUI toevoegen

Maar wat als, in dit laatste geval, je niet wilt dat het gewoon alles genereert, maar iets nuttigs doet. We zouden er nog een kunnen toevoegen

 elif 

statement om alle indelingen te genereren wanneer "all" wordt ingevoerd op de opdrachtregel en de instructie wijzigt om wat helptekst af te drukken:

 #! / bin / bash file = $ 1 export = $ 2 if ["$ export" == "html"] dan pandoc -r markdown -w html -o $ file.html $ file elif ["$ export" == "docx "] dan pandoc -r markdown -w docx -o $ file.docx $ file elif [" $ export "==" odt "] dan pandoc -r markdown -w odt -o $ file.odt $ file elif [" $ exporteer "==" epub "] dan pandoc -r markdown -w epub -o $ file.epub $ file elif [" $ export "==" all "] dan pandoc -r markdown -w html -o $ file.html $ file && pandoc -r markdown -w docx -o $ file.docx $ file && pandoc -r markdown -w odt -o $ file.odt $ file && pandoc -r markdown -w epub -o $ file.epub $ file anders echo "Voeg een van de volgende opties toe na de bestandsnaam: html, odt, docx, epub of alles." fi 

Maar het zal handiger zijn om, in het geval van een blanco of onjuiste vlag, een GUI weer te geven om de gebruiker te helpen. Ten eerste moeten we een set hulpprogramma's installeren die Zenity wordt genoemd, om ons te helpen. U kunt dit vanuit het Software Center installeren of de volgende opdracht gebruiken:

 sudo apt-get install zenity 

Vervolgens zullen we Zenity moeten gebruiken om een ​​dialoog voor ons te creëren. We zullen iets willen hebben waar de gebruiker alle of enkele van de opties die we beschikbaar hebben kan selecteren ... vinkjes klinken hier als het juiste. Dus we maken een Zenity-dialoogvenster met selectievakjes die al onze opties vertegenwoordigen:

 #! / bin / bash zenity --list --checklist --title = "Pandoc Publisher" --column = "" --column = "Export Format" FALSE "html" FALSE "odt" FALSE "docx" FALSE "epub " 

Je kunt zien hoe het bovenstaande Zenity-commando is opgebouwd door de handleiding hier te lezen. Vervolgens moeten we de lijst opvragen van wat de gebruiker controleert, en deze toewijzen aan een variabele. Door een variabelenaam toe te voegen en de Zenity-opdracht tussen haakjes te plaatsen en een "$" -teken toe te voegen, weet de shell dat de opdracht binnenin moet worden vervangen door het resultaat als het klaar is:

 #! / bin / bash keuzes = $ (zenity --list --checklist --title = "Pandoc Publisher" --column = "" --column = "Export Format" FALSE "html" FALSE "odt" FALSE "docx "FALSE" epub "); 

Nu hebben we een variabele "$ keuzes" die een lijst bevat (standaard gescheiden door "|") van alle geselecteerde opties. We moeten controleren om te zien of die lijst alle indelingen bevat die we willen afhandelen met "= ~" in plaats van "==" (dit controleert of iets iets anders bevat, in dit geval) ... voor voorbeeld:

 als [[$ choices = ~ "html"]] 

Ten slotte zal een snelle wijziging van het script dit dialoogvenster tonen als er geen indeling wordt aangeboden, en vervolgens de juiste Pandoc-opdracht uitvoeren wanneer die optie in het dialoogvenster is aangevinkt:

 #! / bin / bash file = $ 1 export = $ 2 if ["$ export" == "html"] dan pandoc -r markdown -w html -o $ file.html $ file elif ["$ export" == "docx "] dan pandoc -r markdown -w docx -o $ file.docx $ file elif [" $ export "==" odt "] dan pandoc -r markdown -w odt -o $ file.odt $ file elif [" $ exporteer "==" epub "] dan pandoc -r markdown -w epub -o $ file.epub $ file elif [" $ export "==" all "] dan pandoc -r markdown -w html -o $ file.html $ file && pandoc -r markdown -w docx -o $ file.docx $ file && pandoc -r markdown -w odt -o $ file.odt $ file && pandoc -r markdown -w epub -o $ file.epub $ file else keuzes = $ (zenity --list --checklist --title = "Pandoc Publisher" --column = "" --column = "Export Format" FALSE "html" FALSE "odt" FALSE "docx" FALSE "epub" ); als [[$ choices = ~ "html"]] dan pandoc -r markdown -w html -o $ file.html $ bestand; fi als [[$ choices = ~ "odt"]] dan pandoc -r markdown -w docx -o $ file.docx $ file; fi als [[$ choices = ~ "docx"]] dan pandoc -r markdown -w odt -o $ file.odt $ bestand; fi als [[$ choices = ~ "epub"]] dan pandoc -r markdown -w epub -o $ file.epub $ file; fi fi 

Zo ook een gepersonaliseerde applicatie met GUI en opdrachtregelopties.