Difference between revisions of "Bash scripts"
m (→while) |
m (→for) |
||
Line 98: | Line 98: | ||
</source> | </source> | ||
== for == | == for == | ||
− | '''SYNTAX:''' | + | '''SYNTAX:''' |
− | |||
− | |||
::'''for NAME in WORDS''' | ::'''for NAME in WORDS''' | ||
::'''do''' | ::'''do''' | ||
Line 124: | Line 122: | ||
</source> | </source> | ||
+ | = beslutninger = | ||
+ | Man har ofte brug for at tage ja/nej beslutninger i scripts. For eksempel om en fil eksisterer. | ||
+ | == if == | ||
+ | '''SYNTAX:''' | ||
+ | ::'''if''' ''COMMAND'' | ||
+ | :: '''then''' | ||
+ | ::: COMMANDS | ||
+ | :: '''[ else''' | ||
+ | ::: ''COMMANDS'' ''']''' | ||
+ | :: '''fi''' | ||
+ | ---- | ||
+ | '''FORKLARING:''' | ||
+ | ::Hvis ''exit'' status fra COMMAND i if linien er '''0''' udføres kommandoerne efter '''then'''. | ||
+ | ::Hvis ''exit'' status fra COMMAND i if linien er '''1''' udføres kommandoerne efter '''else''', hvis '''else''' sætningen eksisterer. Den er sat i firkantede paranteser [] hvilket betyder at den er optionel - man kan selv vælge om den skal med. | ||
+ | ::En '''if'' sætning skal mindst indeholde et '''then''' og et '''fi''' (if stavet bagfra) | ||
+ | ---- | ||
+ | '''EKSEMPEL:''' | ||
+ | ::Bash scriptet herunder skriver 5 linier på skærmen. En for Hans, en for Ulla .... | ||
+ | <source lang=cli> | ||
+ | #!/usr/bin/bash | ||
+ | echo -en "Hvad er dit navn: " | ||
+ | read NAVN | ||
+ | |||
+ | if test "$NAVN" == "Anders And" | ||
+ | then | ||
+ | echo "Hej Anders" | ||
+ | else | ||
+ | echo "Hej $NAVN har du set Anders And" | ||
+ | fi | ||
+ | </source> | ||
Revision as of 12:52, 24 August 2009
Denne artikel er en del af den samlede dokumentation af bash.
Contents
Mit første bash script
Hvor skal script-filen placeres
Det er vigtigt at scriptet ligger i et bibliotek der er med i søgning i variablen $PATH
[heth@mars ~]$ <input>who am i</input>
<notice>heth</notice> ttyp2 Aug 24 07:51 (192.168.22.136)
[heth@mars ~]$ <input>echo $PATH</input>
/sbin:/bin:/usr/sbin:/usr/bin:<notice>/home/heth/bin</notice>
Biblioteket hvor brugeren heth skal ligge sin scripts hedder /home/heth/bin. Opret dette bibliotek hvis det ikke eksisterer og skift til dette bibliotek.
[heth@mars ~]$ <input>mkdir /home/heth/bin</input>
[heth@mars ~]$ <input>cd /home/heth/bin</input>
Oprettelse af scriptet
Før vi opretter scriptet er det nødvendigt at vide hvor bash er installeret på maskinen. Bash programmet skal alle andre programmer er normalt placeret i et bin eller sbin bibliotek. På min maskine er den installeret i /usr/bin/bash som vist nedenfor.
[heth@mars ~/bin]$ <input>whereis bash</input>
bash: <notice>/usr/bin/bash</notice> /usr/local/man/man1/bash.1.gz /usr/ports/shells/bash
Opret scriptet med din ynglingseditor. pico,nano,edit,emacs eller vi. vi editoren findes på alle versioner af Linux og Unix, og er derfor en god editor at kende. Den kan dog drille lidt, så vælg pico hvis du er i tvivl - og den er installeret på din Linux/Unix boks.
filen oprettes med
[heth@mars ~/bin]$ <input>vi script1</input>
Indtast nedenstående bash script
#!/usr/bin/bash
echo -en "Hvad er dit navn: "
read NAVN
echo -e "Dit navn er $NAVN"
Afvikling af shell scriptet
For at afvikle shell scriptet skal bash vide at det er en udførbar fil. Altså et program der kan blive til en process.
[heth@mars ~/bin]$ <input>ls -l script1</input>
<notice>-rw-r--r--</notice> 1 heth heth 99 Aug 24 10:41 script1
[heth@mars ~/bin]$ <input>chmod +x script1</input>
[heth@mars ~/bin]$ <input>ls -l script1</input>
<notice>-rwxr-xr-x</notice> 1 heth heth 99 Aug 24 10:41 script1
nu er scriptet klar til at køre
[heth@mars ~/bin]$ <input>script1</input>
Hvad er dit navn: <input>Mickey Mouse</input>
Dit navn er Mickey Mouse
Loops
Der er flere foskellige måder at lave loops på i scripts. Hvilken metode der skal anvendes i hvilket tilfælde er baseret på erfaring. For at forstå loops er det vigtigt at forstå en process exit status. En process returnerer en værdi til bash der beskriver hvordan process forløb.
I eksemplet herunder kan det ses at kommandoen ls -l script1 går godt fordi filen script1 eksisterer. Variablen $? indeholder exit status fra den sidste process der afsluttede. Denne indeholder her 0 som betyder det gik godt.
[heth@mars ~/bin]$ <input>ls -l script1</input>
-rwxr-xr-x 1 heth heth 88 Aug 24 11:43 script1
[heth@mars ~/bin]$ <input>echo $?</input>
<notice>0</notice>
I eksemplet herunder kan det ses at kommandoen ls -l script190 fejler fordi filen script190 ikke eksisterer. Variablen $? indeholder exit status fra den sidste process der afsluttede. Denne indeholder her 1 som betyder at kommandoen fejlede .
[heth@mars ~/bin]$ <input>ls -l script190</input>
ls: script190: No such file or directory
[heth@mars ~/bin]$ <input>echo $?</input>
<notice>1</notice>
while
SYNTAX:
- while COMMAND
- do
- COMMANDS
- done
FORKLARING:
- while udfører kommandoerne der står mellem do og done hvis kommandoen efter while går godt - altså har en exit status på 0. Herefter springer den tilbage og udfører while forfra. Hvis kommandoen efter while altid har en exit status på 0 vil while sætningen køre i en uendelig løkke. (Kan stoppes med <CTRL>-C
- Hvis exit status er forskellig fra 0 udføres kommandoerne mellem do og done ikke og while kommandoen afsluttes helt.
EKSEMPEL:
- I eksemplet herunder anvendes kommandoen test for at teste om variablen COUNT er mindre end eller lig med '-le (Lesser than or Equal to).
- Bash scriptet herunder skriver 100 linier på skærmen hvor COUNT tælles op fra 1 til 100.
#!/usr/bin/bash
COUNT=1
while test $COUNT -le 100
do
echo "Count har talt til $COUNT"
let COUNT=COUNT+1
done
for
SYNTAX:
- for NAME in WORDS
- do
- COMMANDS
- done
FORKLARING:
- for udfører kommandoerne der står mellem do og done for hvert enkelt ord i listen WORDS. Variablen NAME vil efter tur indeholde hvert ord der står i listen WORDS
- Hvis exit status er forskellig fra 0 udføres kommandoerne mellem do og done ikke og while kommandoen afsluttes helt.
EKSEMPEL:
- Bash scriptet herunder skriver 5 linier på skærmen. En for Hans, en for Ulla ....
#!/usr/bin/bash
VENNER="Hans Ulla Grethe Svend Bo"
for VEN in $VENNER
do
echo "Jeg har en ven der hedder $VEN."
done
beslutninger
Man har ofte brug for at tage ja/nej beslutninger i scripts. For eksempel om en fil eksisterer.
if
SYNTAX:
- if COMMAND
- then
- COMMANDS
- [ else
- COMMANDS ]
- fi
FORKLARING:
- Hvis exit status fra COMMAND i if linien er 0 udføres kommandoerne efter then.
- Hvis exit status fra COMMAND i if linien er 1 udføres kommandoerne efter else, hvis else sætningen eksisterer. Den er sat i firkantede paranteser [] hvilket betyder at den er optionel - man kan selv vælge om den skal med.
- En if sætning skal mindst indeholde et then' og et fi (if stavet bagfra)
EKSEMPEL:
- Bash scriptet herunder skriver 5 linier på skærmen. En for Hans, en for Ulla ....
#!/usr/bin/bash
echo -en "Hvad er dit navn: "
read NAVN
if test "$NAVN" == "Anders And"
then
echo "Hej Anders"
else
echo "Hej $NAVN har du set Anders And"
fi