Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: !/bin/bash: Gebruik functies en printf ipv echo...  (gelezen 4366 keer)

Offline masy

  • Lid
  • Steunpunt: Nee
!/bin/bash: Gebruik functies en printf ipv echo...
« Gepost op: 2009/08/09, 00:19:12 »
In de vele voorbeelden van !/bin/bash scripting zie ik de meeste gebruikers nog steeds gebruik maken van het verouderde "echo" commando. Verder worden terugkerende zaken zoals het afvangen van gebruikers-invoer in eenvoudige read weggezet. Als alleen (J)a of (N)ee ingevoerd kan worden, mag een andere invoer niet de executie-flow van het programma verstoren... Daarvoor bestaan er functies binnen !/bin/bash.

Derhalve onderstaand scriptje, waar ook de Newbies onder ons hun voordeel kunnen halen. Kopiëer dit scriptje in een tekstverwerker en sla het op als envdemo.sh. Zet het execute-bit aan. En start het scriptje in een console met ./envdemo.sh.

Denk nu niet dat ik dit scriptje ergens gedownload en vertaald heb. Het is een mix van vele maanden/jaren zoeken en zelf uittesten. Die onzin wil ik jullie besparen. Loop de syntax eens door en leer begrijpen hoe !/bin/bash werkt. Het gebruik van variabelen, functies, printf ipv echo, while do, if then etc...
Alles zit in dit kleine scriptje. Doe er je voordeel mee. Hier komt de code:

#!/bin/bash
#########################################################################################
# SCRIPTING TEST: envdemo.sh #
# Copyright Marcel van den Berg ( AKA Masy ) #
# #
# This software is GPL and free to use #
#########################################################################################
# Program information #
#########################################################################################
PROGRAM_NAME="envdemo script"
PROGRAM_version="1.0.0"
PROGRAM_releasedate="08-08-2009"
PROGRAM_copyright_owner="Masy"
PROGRAM_copyright="Copyright 2007-2009, ${PROGRAM_copyright_owner}"
PROGRAM_license="${PROGRAM_NAME} ${PROGRAM_version}\n${PROGRAM_copyright}"
#########################################################################################

RESPONSE="" # STRING-VARIABELE WAAR INVOER READ WORDT BEWAARD

#########################################################################################
# GLOBALE FUNCTIES #
#########################################################################################

keypresspause() # WACHT OP EEN TOETSDRUK VOOR DOORGAAN
      {
 printf "[Druk een willekeurige toets om door te gaan]\n"
 read a
      }

keypressyes()  # WACHT OP TOETSDRUK j/J/y -> RESULT IN RESPONSE
      {
        RESPONSE=""
        while RESPONSE=""; do  
         read -p "Kies (J)a of (N)ee: " RESPONSE
         if [ "$RESPONSE" = "j" -o "$RESPONSE" = "J" -o "$RESPONSE" = "y" ]
           then
             break
         fi
         if [ "$RESPONSE" = "n" -o "$RESPONSE" = "N" ]
           then
             break
         fi
         RESPONSE=""
         printf "INVOER-FOUT: Geen (J)a of (N)ee ingevoerd.\n"
         printf "U kunt ook CTRL-C gebruiken om dit script af te breken\n"
        done
      }

#########################################################################################
# START INPUT-DEMO #
#########################################################################################
clear
        printf "${PROGRAM_license}\n"
        printf "Programma gestart op `date '+%A %d %B %Y - %H:%M:%S '`\n"
        printf "Onder `uname -s -r ` op een `uname -m` processor\n"
        printf "Linuxversie: `uname -v`\n\n"
keypressyes
         if [ "$RESPONSE" = "n" -o "$RESPONSE" = "N" ]
           then
             echo "Nee gekozen, het programma werd afgebroken"
             exit
         fi
        printf "Programma ${PROGRAM_NAME} doorlopen:\nGeëindigd op `date '+%A %d %B %Y - %H:%M:%S '`\nOK...\n\n"



Moderator edit: code-tags toegevoegd
« Laatst bewerkt op: 2009/08/09, 11:21:49 door Nunslaughter »

Offline SeySayux

  • Lid
    • SeySayux.net
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #1 Gepost op: 2009/08/09, 11:28:42 »
Even een paar kleine opmerkingen....
Ten eerste druk je hier enkel statische strings af, en geen geformatteerde strings... dus snap ik niet waar je printf voor nodig hebt... Bovendien is echo voor gewone statische strings sneller (een beetje zoals in C, als je puts ipv printf kan gebruiken, doe je het ook)... Ten tweede zet je keypressyes een waarde in een global... niet echt handig, kan zelfs race-conditions maken...

Hier mijn yn:
function yn() {
      if [ -z "$*" ]; then
            echo "yn: error: you need to supply a message first!" >&2;
      fi
      echo -n "$* (Y/n) "
      read x
      case "$x" in
      y*|Y*|'')
            return 0;;
      n*|N*)
            return 1;;
      *)
            echo 'Please answer y(es) or n(o).'
            return yn $*;;
      esac
}
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline ivo

  • Lid
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #2 Gepost op: 2009/08/09, 22:10:06 »
Hoi Masy. Met respect voor je enthousiasme en je wil om het te delen met anderen, wil ik toch het volgende even kwijt.

Als ik een sciptje bouw en ik weet even iets niet dan zoek ik dat op in de eerste de beste bash-scripting manual die google laat zien. Meestal heb ik dan binnen 5 minuten wat ik nodig heb.

Hoe kom je erbij dat dit maanden/jaren zoeken en testen kost?
There are only 10 types of people in the world; those who understand binary and those who don't.

Offline maxpower

  • Lid
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #3 Gepost op: 2009/08/10, 13:34:20 »
als je het rechstreeks uit handleidingen wil halen zal het msischien evne zoeken zijn.. Mwah goede toevoeging voor beginneners. Is er niet al een beginnershandleiding ergens op internet te vinden? Want opzich is het best handig dit soort dingetjes bij de hand te hebben zonder daarvoor te hoeven googlen.

Offline track

  • Lid
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #4 Gepost op: 2009/08/10, 14:00:36 »
Voor mijn eigen gebruik heb ik deze links: 
(toenemend geavanceerd)

http://www.ibm.com/developerworks/library/l-bash.html  (met goede voorbeelden)
http://shell.w3reference.com/  [-> even op de tab "shell" klikken]
http://linux.die.net/man/  (volledige man-pages, netjes geformatteerd ook)
http://www.gnu.org/software/bash/manual/bashref.html  (de referentie)

Vriendelijke groet,

track

Offline maxpower

  • Lid
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #5 Gepost op: 2009/08/10, 14:08:00 »
Kijk dit zijn nou handige links!! :) thnx!

Offline Johan van Dijk

  • Administrator
    • johanvandijk
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #6 Gepost op: 2009/08/10, 14:18:54 »
Deze is ook erg uitgebreid: http://tldp.org/LDP/abs/html/index.html
Gebruik ik ook vrij regelmatig :)


Offline track

  • Lid
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #7 Gepost op: 2009/08/10, 15:13:25 »
Hoi Masy,

in het algemeen gebruik ik in mijn eigen scriptjes ook echo ,
alleen voor geformatteerde output printf .
Gewoon gemakshalve, en ik zie er eigenlijk ook geen bezwaar tegen de  echo.

Vaak zijn er meerdere mogelijkheden in de Linux-wereld.  Dat is een van zijn sterke punten.

Om een enkele toets te lezen zou ik read  met de parameter -n gebruiken:
(dan wacht hij niet op de [enter], zie ook  read --help )
#!/bin/bash

echo "Kies [j]a  of [n]ee:"
read -n 1 antwoord

if [ "$antwoord" == "j" ]; then                           # -> "j" betekent "ja", iedere andere toets wordt als "nee" opgevat
        echo " gedrukt, dus het antwoord is \"ja\""
else    echo " gedrukt, dus het antwoord is \"nee\""
fi

Vriendelijke groet,

track

edit: typo
« Laatst bewerkt op: 2009/08/10, 16:45:27 door track »

Offline maxpower

  • Lid
  • Steunpunt: Nee
Re: !/bin/bash: Gebruik functies en printf ipv echo...
« Reactie #8 Gepost op: 2009/08/10, 21:59:50 »
Dat is wel een leuke tip idd als je iets met ja en nee wil doen :) dan heb je idd maar 1 letter nodig..