Articles

het Geek dagboek

Er zijn vele malen in een shell script wanneer u herhaaldelijk een statement of groep van statements wilt uitvoeren totdat een bepaalde voorwaarde optreedt. Daarnaast kunt u een groep statements uitvoeren voor elk element in een bepaalde lijst. De shell biedt drie lusconstructies voor deze situaties: De for, while en untilconstructies.

met de lus for kunt u een lijst met waarden opgeven. Voor elke waarde in de lijst wordt een groep statements uitgevoerd.

voor lus syntaxis

de lus in de shell neemt een lijst met woorden (strings) als argument. Het aantal woorden in de lijst bepaalt het aantal keren dat de statements in de for-lus worden uitgevoerd. De syntaxis voor de for-lus is:

for variable in element1 element2 element3 do commands done

waarbij:

  • variabele: het is elke variabele naam.
  • elements (argument_list): het kan elke lijst van woorden, tekenreeksen of getallen zijn, en het kan letterlijk zijn of gegenereerd met behulp van een shell-commando of shell-command-line metacharacter.
  • opdrachten: De commando ’s kunnen elk besturingssysteem commando’ s zijn, een gebruikersprogramma, een shell script, of een shell statement dat een lijst retourneert (produceert).

de waarde van de variabele var wordt ingesteld op het eerste woord in de lijst de eerste keer door de lus. De tweede keer door de lus, wordt de waarde ingesteld op het tweede woord in de lijst, enzovoort. De lus eindigt wanneer var elk van de waarden uit de lijst met argumenten op zijn beurt heeft overgenomen en er geen overgebleven argumenten zijn.

de lijst met argumenten voor lus

de lijst met argumenten in een lus voor kan elke lijst van woorden, tekenreeksen of getallen zijn. Genereer de lijst met argumenten met behulp van een van de volgende methoden (of een combinatie van methoden):

  • gebruik een expliciete lijst
  • gebruik de inhoud van een variabele
  • gebruik opdrachtregelargumenten
  • gebruik opdrachtvervanging
  • gebruik bestandsnamen in opdrachtvervanging

Voorbeeld 1 : Voor lus gebruik een expliciete lijst om argumenten

op te geven wanneer argumenten worden weergegeven voor een lus, worden ze een expliciete lijst. Een expliciete lijst is de eenvoudigste vorm van een lijst met argumenten. De lus wordt eenmaal uitgevoerd voor elk lijstelement. Het volgende voorbeeld is een for loop die gebruik maakt van een expliciete lijst van elementen:

#!/bin/bashfor fruit in apple orange banana peach kiwi do echo "Value of fruit is: $fruit"done

De uitvoer van deze for loop is:

Value of fruit is: apple Value of fruit is: orange Value of fruit is: banana Value of fruit is: peach Value of fruit is: kiwi

Voorbeeld 2 : For loop using Variable Contents to Specify Arguments

wanneer de argumenten in een variabele staan en het statement wordt uitgevoerd, de inhoud van de variabele wordt vervangen. In het volgende voorbeeld wordt de tekst die achter de prompt wordt ingevoerd de waarde van de variabele invoer. Deze variabele vertegenwoordigt de lijst met argumenten van de for construct. Daarom wordt de tekst in de invoer opgesplitst in woorden of tokens op basis van witruimte.

$ cat ex1.sh #!/bin/bash# Script name: ex1.shecho "Enter some text: \c" read INPUTfor var in $INPUT do echo "var contains: $var"done

$ ./ex1.shEnter some text: I like the Bash shell. var contains: Ivar contains: likevar contains: thevar contains: Kornvar contains: shell.

Voorbeeld 3 : Voor lus die opdrachtregelargumenten gebruikt om argumenten

op te geven In het volgende voorbeeld wordt de tekst ingevoerd op de opdrachtregel de lijst met argumenten van de for construct. Daarom wordt de opdrachtregeltekst opgesplitst in woorden of tokens op basis van witruimte.

$ cat ex2.sh#!/bin/bash# Script name: ex2.shfor var in $* do echo "command line contains: $var"done

$ ./ex2.sh I am The Geek.command line contains: Icommand line contains: amcommand line contains: Thecommand line contains: Geek.

Voorbeeld 4 : Voor lus die Commando substitutie gebruikt om argumenten

op te geven, is de syntaxis voor commando substitutie in een bash shell:

for var in `cmd_sub`

het volgende voorbeeld gebruikt de uitvoer van het cat commando als de lijst met argumenten.

$ cat fruit1 apple orange banana peachkiwi

$ cat ex4.sh #!/bin/bash# Script name: ex4.shfor var in `cat fruit2` do echo "var contains: $var"done

$ ./ex4.shvar contains: Apple var contains: Orange var contains: Banana var contains: Peach var contains: Kiwi

als het bestand met de lijst in het volgende formaat was, wat is het resultaat van de for-lus.

$ cat fruit3Apple Orange Banana Peach Kiwi

$ cat ex5.sh #!/bin/bash# Script name: ex5.shfor var in `cat fruit3` do echo "$var"done

$ ./ex5.shApple Orange Banana Peach Kiwi

in het bovenstaande voorbeeld veranderen de resultaten niet. De IFS variabele is elke witruimte, dus zowel een carriage return als een spatie of tab scheiden elk veld in het bestand.

Voorbeeld 5: voor lus die bestandsnamen gebruikt in Opdrachtvervanging om argumenten op te geven

sommige opdrachten geven bestandsnamen en mapnamen als uitvoer. In het volgende voorbeeld, vervangt de shell de uitvoer van het commando, ls/etc/p*(/etc/passwd/etc / profile en ga zo maar door), als de lijst met argumenten voor de for-lus.

$ cat ex7.sh #!/bin/bash# Script name: ex7.shfor var in `ls /etc/p*`do print "var contains: $var"done

# ./x.sh var contains: /etc/passwdvar contains: /etc/passwd-var contains: /etc/printcapvar contains: /etc/profile....