Skriva Bash-skript och hantera options, commands, arguments

  • Författare
  • Meddelande
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Skriva Bash-skript och hantera options, commands, arguments

Inlägg04 aug 2015, 15:32

Det finns en artikel i /kunskap som visar hur man skriver Bash-skript tillsammans med options, commands and arguments. Artikeln ger en struktur till hur du kan skriva lite större och mer avancerade Bash-skript.

"Skapa Bash-skript med options, command och arguments"

Fråga och kommentera artikeln, eller föreslå alternativa sätt.
...
..:
.... /mos

adrian

html-guru

  • Inlägg: 60
  • Blev medlem: 20 jan 2015, 00:24

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg23 feb 2016, 01:17

Funderade på varför det var en while sats i "Process options", när alla "case-patterns-block" avslutas med exit 0 eller exit 1 och while aldrig kommer att "loopa", så det kunde lika gärna vara en if sats...

Misstänker efter lite funderande att konstruktionen med while gör att man bl.a. kan lägga till ett "case-pattern", en option i det här exemplet:
--verbose, utan exit och med shift samt ev. funktions anrop eller variabel tilldelning.

I stil med:

Kod: Markera allt
#
# Process options
#
while (( $# ))
do
    case "$1" in

      --verbose)
         shift
         VERBOSE=1
     ;;

# more code...
   
    esac
done



Då kan man köra skriptet med --verbose som option samt en annan option eller command, t.ex:

$ bash bash-cli --verbose commando1

Så till frågan...är meningen med while-satsen just att kunna hantera multipla options / commands till skriptet eller är det en annan tanke bakom?

/adrian.
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg23 feb 2016, 10:31

Du har helt rätt i att det kan se udda ut i exemplet med exit efter varje del.
https://github.com/mosbth/linux/blob/ma ... #L121-L156

Men du är på rätt väg med din förklaring också. Det är så det är tänkt och det är nog så att det inte tydligt framgår i exemplet. Tanken är att man kan "skicka" in multipla options som styr hur programmet beteer sig.

Här är ett exempel där det framgår mer tydligt hur det kan se ut, exemplet är från dbwebb-cli.
https://github.com/mosbth/dbwebb-cli/bl ... #L729-L825
...
..:
.... /mos

ProfessorPotatis

javascriptare

  • Inlägg: 39
  • Blev medlem: 14 jan 2016, 17:03

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg16 sep 2016, 14:02

Jag har några frågor kring koden i bash-cli.
I artikeln som ligger uppe https://dbwebb.se/kunskap/skapa-bash-skript-med-options-command-och-arguments är koden för calendern annorlunda än den som finns i kursrepots exempel-mapp. Det enda som skiljer koden i artikeln med den koden man själv laddar ner är en liten, liten detalj.

I artikeln:
Kod: Markera allt
...
   
    echo "This is output from command3, showing the current calender."
    cal  <---- HÄR!
   
...


I koden man laddar ner:
Kod: Markera allt
...

    echo "This is output from command3, showing the current calender."
    cal -3 <---- HÄR!

...


När jag försöker köra koden med "cal -3" i terminalen får jag upp följande meddelande:
SofiaKristiansen$ ./bash-cli calendar
This is output from command3, showing the current calender.
cal: illegal option -- 3
usage: cal [-jy] [[month] year]
cal [-j] [-m month] [year]
ncal [-Jjpwy] [-s country_code] [[month] year]
ncal [-Jeo] [year]


När jag istället kör koden med "cal" i terminalen får jag upp:
SofiaKristiansen$ ./bash-cli calendar
This is output from command3, showing the current calender.
September 2016
Sö Må Ti On To Fr Lö
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30


När jag försöker (liksom du i demo-videon) köra ./bash-cli calendar events | more får jag följande:
This is output from command3, showing the current calender.
September 2016
Sö Må Ti On To Fr Lö
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30


calendar: can't open calendar file "calendar": No such file or directory (2)


Vad gör jag för fel med events?
Varför fungerar inte calendar när min kod innehåller "cal -3"?

I övrigt en väldigt bra artikel som visar på hur man kan strukturera sina större Bash-skript.
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10922
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg19 sep 2016, 14:59

Det ser ut som mitt kommando cal har stöd för en option som heter -3 för att visa tre månader, men din variant av cal stödjer inte den optionen.

Så jag borde rimligen ändra mitt program för att ta bort den optionen som exempelkod.

Kod: Markera allt
desktop:~/git/uptime$ cal                                                                   
   September 2016                                                                           
Su Mo Tu We Th Fr Sa                                                                         
             1  2  3                                                                         
4  5  6  7  8  9 10                                                                         
11 12 13 14 15 16 17                                                                         
18 19 20 21 22 23 24                                                                         
25 26 27 28 29 30                                                                           
                                                                                             
desktop:~/git/uptime$ cal -3                                                                 
    August 2016          September 2016         October 2016                                 
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa                             
    1  2  3  4  5  6               1  2  3                     1                             
7  8  9 10 11 12 13   4  5  6  7  8  9 10   2  3  4  5  6  7  8                             
14 15 16 17 18 19 20  11 12 13 14 15 16 17   9 10 11 12 13 14 15                             
21 22 23 24 25 26 27  18 19 20 21 22 23 24  16 17 18 19 20 21 22                             
28 29 30 31           25 26 27 28 29 30     23 24 25 26 27 28 29                             
                                            30 31                                           
desktop:~/git/uptime$ cal --help                                                             
cal: invalid option -- '-'                                                                   
Usage: cal [general options] [-jy] [[month] year]                                           
       cal [general options] [-j] [-m month] [year]                                         
       ncal [general options] [-bhJjpwySM] [-H yyyy-mm-dd] [-s country_code] [[month] year] 
       ncal [general options] [-bhJeoSM] [year]                                             
General options: [-C31] [-A months] [-B months] [-d yyyy-mm]                                 
desktop:~/git/uptime$                                                                       
...
..:
.... /mos
Användarvisningsbild

annettekusma

sql-guru

  • Inlägg: 102
  • Blev medlem: 11 aug 2017, 10:16
  • Ort: Eskilstuna

Re: Skriva Bash-skript och hantera options, commands, argume

Användarvisningsbild

Zeldah

dbwebb

  • Inlägg: 490
  • Blev medlem: 02 mar 2016, 10:17

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg13 feb 2018, 08:15

annettekusma skrev:i rad 37:
Kod: Markera allt
" --version, -h


borde det nog stå
Kod: Markera allt
-v

Tack, fixat.
Användarvisningsbild

fraa18

css-hackare

  • Inlägg: 26
  • Blev medlem: 31 aug 2018, 13:31

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg21 feb 2019, 10:43

Har en fråga kring att sätta variabler. Håller på med kmom05 med Mazerunner. När jag kör init så får jag ett game id som jag sparar till fil. Men jag skulle också vilja sätta en variabel för game id som jag sen kan använda i andra funktioner. Jag har försökt med att deklarera en variabel högst upp utanför funktionen som kör init. Den har jag satt till GAMEID="". Sen tänkte jag att jag kan komma åt den inuti init-funktionen och uppdatera den där så att jag sen kan komma åt den i alla andra funktioner som behöver GAMEID.

Men det verkar inte fungera så som jag tänkt. Då jag försöker uppdatera variabeln inuti init-funktionen så gör jag det med command substitution, dvs
Kod: Markera allt
GAMEID=$(tail -n 1 $GAMEIDFILE | cut -d ',' -f 2)
. Och då förstår jag det som att kommandot körs i ett separat shell och att det shell som är utanför inte ärver uppdateringen. Dvs variablerna går bara in i shellen men inte ut.

Som jag har löst det nu är att jag behöver sätta GAMEID på nytt varje gång jag har en funktion som behöver det. Men finns det något annat sätt att lösa detta på som är bättre?
Användarvisningsbild

Lew

dbwebb

  • Inlägg: 387
  • Blev medlem: 05 sep 2012, 13:42
  • Ort: Karlskrona

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg21 feb 2019, 11:05

Har du lite mer kod att gå på?

Vid en första anblick ser raden du visar korrekt ut, så det kan bero på något annat.
When in doubt, use brute force.
Användarvisningsbild

fraa18

css-hackare

  • Inlägg: 26
  • Blev medlem: 31 aug 2018, 13:31

Re: Skriva Bash-skript och hantera options, commands, argume

Inlägg21 feb 2019, 11:17

Tex här när jag vill använda GAMEID i funktionen app-enter så är den bara "" om jag inte avkommenterar första raden i app-enter.
Jag vill kunna sätta GAMEID en gång i app-init och sen använda den i alla funktioner och ev även uppdatera variabeln vid behov.

Kod: Markera allt
GAMEID=""
. . .

function app-init {
    curl -s $LINUX_SERVER:$LINUX_PORT/?type=csv | tee gameId.csv
    GAMEID=$(tail -n 1 $GAMEIDFILE | cut -d ',' -f 2)
}

. . .

function app-enter {
    #GAMEID=$(tail -n 1 $GAMEIDFILE | cut -d ',' -f 2)
    curl -s $LINUX_SERVER:$LINUX_PORT/$GAMEID/maze?type=csv | tee room.csv
    echo
}

. . .

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 5 gäster