[bash]Loop onderbreken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 24-06 09:35

CoRrRan

Don't Panic!!!

Topicstarter
Voor mijn bedrijf heb ik, samen met ex-collega's, een bash-script geschreven die het volgende doet:
(De gebruiker logt in op een server via PuTTy, waar cygwin-linux op draait met bash-shell.)
  1. Gebruiker voert commando + argument in (argument is een wildcard-achtig argument, dat overeenkomt met wat je na ls zou gebruiken, dus bijv. commando '*.dat')
  2. Het script maakt adhv het argument een lijst met bestanden die gevonden worden in de huidige folder.
  3. Elk van deze bestanden wordt één voor één aan een ander programma doorgegeven als argument.
  4. Dit andere programma gaat rekenen met de informatie die in elk van deze bestanden zit. De duur hiervan is nooit precies te weten, kan 1 minuut zijn, maar ook 48 uur.
  5. Als alle bestanden doorgelopen zijn, sluit het script af.
Wat ik nu zou willen, is tijdens de while-loop, dat als het programma (van stap 4) aan het rekenen is, de gebruiker op een bepaalde toets kan drukken (neem voor het gemak "p") en dat aan het eind van de berekening (dus niet het eind van het script!) het script pauzeert en wacht op een nieuwe toets en daarna doorgaat naar het volgende bestand wat aan het andere programma gevoerd moet worden.

Kan dit? Ik snap goed wat mijn huidige code doet, maar dit soort zaken heb ik niet veel kaas van gegeten.

Ik heb het volgende gevonden op internet, ik ben benieuwd of iemand hier kan zeggen dat dit gaat opleveren wat ik wil hebben:
To allow them to continue after hitting any key, I usually create a function (I usually call it readOne, after the function I stole the idea from ):

Code:
code:
1
2
3
4
5
6
7
8
9
10
readOne () {
tput smso
echo "Press any key to return \c"
tput rmso
oldstty=`stty -g`
stty -icanon -echo min 1 time 0
dd bs=1 count=1 >/dev/null 2>&1
stty "$oldstty"
echo
}
The call it later from the script:

blah blah ...
readOne
blah blah
exit 0

HTH
Ik vrees dat, als ik deze code toevoeg, ik ELKE keer dat het script deze code tegenkomt de gebruiker weer op een toets moet drukken.

-- == Alta Alatis Patent == --


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Had je het al geprobeerd? Wat je vreest is één ding, maar als je het niet eens uitprobeert en in plaats daarvan liever een topic opent op een forum doe je toch iets verkeert. ;)

Verder: Waar hoort mijn topic? PRG>>NOS

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 11-09 21:28

CAPSLOCK2000

zie teletekst pagina 888

Aub eerst zelf proberen. Ik denk dat het niet gaat werken, maar ik daar helemaal niet zeker van. Ik denk dat wat jij wil sowieso erg lastig is in Bash, zeker voor beginners.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 15:08

Kees

Serveradmin / BOFH / DoC
CAPSLOCK2000 schreef op dinsdag 27 september 2011 @ 17:43:
Aub eerst zelf proberen. Ik denk dat het niet gaat werken, maar ik daar helemaal niet zeker van. Ik denk dat wat jij wil sowieso erg lastig is in Bash, zeker voor beginners.
Het is eigenlijk bijzonder eenvoudig.

1. Dat kan. Let er wel op dat de shell je argument al expand!
code:
1
2
#!/bin/bash
echo $@
($@ = alle argumenten)
Output:
code:
1
2
3
4
5
$ /home/kees/test.sh *.txt
apparmor.txt applying-patches.txt atomic_ops.txt bad_memory.txt

$ /home/kees/test.sh asdf qwerty
asdf qwerty

2. Niet nodig, dat doet bash dus al
3. Makkelijk, pseudocode: for $file in $@; do programma $file; done
4. ..rekenen..
5. lijst leeg? quit

Psuedocode voor je pauze:
code:
1
2
3
4
5
6
7
8
for $file in $@
do
  programma $file
  if read -t 1 -n 1 var # zie man bash, builtin commands 'read' voor wat de opties doen
  then 
    read var #lezen tot je enter ramt (of ctrl-c om alles af te breken
  fi
done

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • sparks
  • Registratie: December 2002
  • Laatst online: 13:50
Mooie oplossing, zat zelf even aan trap te denken maar dit is wellicht eenvoudiger.

Acties:
  • 0 Henk 'm!

  • CoRrRan
  • Registratie: Juli 2000
  • Laatst online: 24-06 09:35

CoRrRan

Don't Panic!!!

Topicstarter
Mijn excuses voor het niet uitproberen. Op het moment dat het naar voren kwam dat er zo'n requirement is, was ik niet in staat om het te testen. En ja, daardoor heb ik te snel een post op het forum gezet.

In ieder geval bedankt voor jullie (Kees!) inbreng, ik ga dit morgen proberen en zal met feedback komen.

-- == Alta Alatis Patent == --

Pagina: 1