Funktioner i sh och bash

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Funktioner i sh och bash

Inlägg av Johnny Rosenberg »

Har letat efter information om detta på nätet och hittat en hel del intressant läsning, men det känns ändå som att lite inte gått in i min lilla trånga hjärna. Formen för en funktion tycks ju vara:

Kod: Markera allt

function-name ( )
   {
      command1
      command2
      .....
      ...
      commandN
      return
   }
Vad jag funderar på är dock vad den tomma parentesen är till för. Det verkar ju aldrig stå något i den, så varför inte bara skippa den? Är det bara för att indikera att det rör sig om en funktion? Som om inte det skulle framgå ändå…
För vad jag tolkar det jag läst om, så fungerar funktioner på samma sätt som hela skript, att parametrar lägger sig i $1, $2 och så vidare, eller har jag missuppfattat det också?

Har nämligen tänkt att omarbeta ett skript jag har och tänkte göra det mer lättläst genom att skapa ett antal funktioner som jag sedan anropar, precis som man alltid gör i exempelvis C.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Funktioner i sh och bash

Inlägg av Lars »

Om det inte vore några parenteser där så skulle det tolkas som ett anrop till en funktion (eller ett kommando).
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Funktioner i sh och bash

Inlägg av Konservburk »

Johnny Rosenberg skrev:Vad jag funderar på är dock vad den tomma parentesen är till för. Det verkar ju aldrig stå något i den, så varför inte bara skippa den? Är det bara för att indikera att det rör sig om en funktion? Som om inte det skulle framgå ändå…
Lars har rätt. Jämför ...

Kod: Markera allt

echo ()
{
   :
}
echo
... med samma kod utan () ...

Kod: Markera allt

echo
{
   :
}
echo
... så inser du förhoppnigsvis varför () behövs för att det ska framgå att det rör sig om en funktion. Det går dock att utelämna () i vissa fall om man istället skriver function framför funktionsnamnet, men då fungerar det inte med sh.
Johnny Rosenberg skrev:För vad jag tolkar det jag läst om, så fungerar funktioner på samma sätt som hela skript, att parametrar lägger sig i $1, $2 och så vidare, eller har jag missuppfattat det också?
Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Funktioner i sh och bash

Inlägg av Johnny Rosenberg »

Konservburk skrev:
Johnny Rosenberg skrev:Vad jag funderar på är dock vad den tomma parentesen är till för. Det verkar ju aldrig stå något i den, så varför inte bara skippa den? Är det bara för att indikera att det rör sig om en funktion? Som om inte det skulle framgå ändå…
Lars har rätt. Jämför ...

Kod: Markera allt

echo ()
{
   :
}
echo
... med samma kod utan () ...

Kod: Markera allt

echo
{
   :
}
echo
... så inser du förhoppnigsvis varför () behövs för att det ska framgå att det rör sig om en funktion. Det går dock att utelämna () i vissa fall om man istället skriver function framför funktionsnamnet, men då fungerar det inte med sh.
Tänkte faktiskt inte på att raden faktiskt inleds med själva funktionsnamnet. Men då är det ju logiskt, även om jag nog hade föredragit formen med ordet function för att indikera att det rör sig om en funktion. Fast ännu hellre hade jag ju sett att sh-skript skrivs exakt som C eller C++, men man kan inte få allt. Csh och tsch är i ju och för sig ett steg närmare C om jag inte minns fel från början av 90-talet då det var just tsch som gällde för min del. Stör mig nämligen lite på det där med att man avslutar saker med satsens namn baklänges: if-fi, while-elihw och så vidare. Vad är det för fel på endif och endwhile eller rent av bara end? Eller bara while(…){ … } som i C.
Konservburk skrev:
Johnny Rosenberg skrev:För vad jag tolkar det jag läst om, så fungerar funktioner på samma sätt som hela skript, att parametrar lägger sig i $1, $2 och så vidare, eller har jag missuppfattat det också?
Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Okej, det var ju egentligen så jag menade.

Är dessa variabler lokala, så att de enbart existerar inuti funktionen?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Funktioner i sh och bash

Inlägg av Konservburk »

Johnny Rosenberg skrev:Stör mig nämligen lite på det där med att man avslutar saker med satsens namn baklänges: if-fi, while-elihw och så vidare. Vad är det för fel på endif och endwhile eller rent av bara end? Eller bara while(…){ … } som i C.
Nu tycker jag att du överdriver lite. Det är bara if-fi och case-esac som finns. Just den biten är en rest från AGOL68. När det gäller while och for så är det do-done som grupperar. Men det går faktiskt att använda krullparenteser istället, åtminstone i vissa fall (dock inte med just ubuntus version av sh, trots att det fungerar med såväl orginalet från 70-talet som med bash):

Kod: Markera allt

for i
do
   echo $i
done

Kod: Markera allt

for i
{
   echo $i
}
När vi ändå är inne på funktioner och udda syntax kan jag inte låta bli att ta upp följande exempel:

Kod: Markera allt

func ()

for i
do
   echo $i
done

func a b c
Johnny Rosenberg skrev:
Konservburk skrev:Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Okej, det var ju egentligen så jag menade.

Är dessa variabler lokala, så att de enbart existerar inuti funktionen?
Ja, de är lokala. Skriptets egna $1 och $2 skrivs inte över. De kommer tillbaka när funktionen är klar. Men till skillnad från hur det är med separata skript så är andra (vanliga) variabler inte lokala om du inte uttryckligen ber om det.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Funktioner i sh och bash

Inlägg av Johnny Rosenberg »

Konservburk skrev:Nu tycker jag att du överdriver lite. Det är bara if-fi och case-esac som finns. Just den biten är en rest från AGOL68. När det gäller while och for så är det do-done som grupperar.
Ja, det har du rätt i. Jag blandar ihop det på något sätt, för jag är säker på att jag sett ”elihw” i något sammanhang. Nåja, vi lämnar väl det då.
Konservburk skrev:Men det går faktiskt att använda krullparenteser istället, åtminstone i vissa fall (dock inte med just ubuntus version av sh, trots att det fungerar med såväl orginalet från 70-talet som med bash):

Kod: Markera allt

for i
do
   echo $i
done

Kod: Markera allt

for i
{
   echo $i
}
När vi ändå är inne på funktioner och udda syntax kan jag inte låta bli att ta upp följande exempel:

Kod: Markera allt

func ()

for i
do
   echo $i
done

func a b c
Johnny Rosenberg skrev:
Konservburk skrev:Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Okej, det var ju egentligen så jag menade.

Är dessa variabler lokala, så att de enbart existerar inuti funktionen?
Ja, de är lokala. Skriptets egna $1 och $2 skrivs inte över. De kommer tillbaka när funktionen är klar. Men till skillnad från hur det är med separata skript så är andra (vanliga) variabler inte lokala om du inte uttryckligen ber om det.
Okej, får försöka ta reda på hur man gör det då, om jag kommer att behöva det.

Sedan har jag sett i en del skript att det står exempelvis:

Kod: Markera allt

export a="hej hej, din gamle fuling"
Det verkar som att det är ett sätt att göra variablen global. Det känner jag att det kan vara användbarti vissa sammanhang. Finns det något sätt att ”utplåna” en global variabel också?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Funktioner i sh och bash

Inlägg av Konservburk »

Johnny Rosenberg skrev:
Konservburk skrev:Ja, de är lokala. Skriptets egna $1 och $2 skrivs inte över. De kommer tillbaka när funktionen är klar. Men till skillnad från hur det är med separata skript så är andra (vanliga) variabler inte lokala om du inte uttryckligen ber om det.
Okej, får försöka ta reda på hur man gör det då, om jag kommer att behöva det.
Enklast är att lägga funktionen i ett subskal.

Kod: Markera allt

func ()
(
  VAR=hejsan
)
Johnny Rosenberg skrev:Sedan har jag sett i en del skript att det står exempelvis:

Kod: Markera allt

export a="hej hej, din gamle fuling"
Det verkar som att det är ett sätt att göra variablen global. Det känner jag att det kan vara användbarti vissa sammanhang. Finns det något sätt att ”utplåna” en global variabel också?
Variabler som markerats med export följer med till separata skript och andra program. Men det behövs inte när det gäller funktioner eftersom alla vanliga variabler i det fallet följer med ända. Du kan avmarkera med export -n om du nu skulle vilja det.
Skriv svar

Återgå till "Terminalforum"