1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
---
category: tool
tool: bash
contributors:
- ["Max Yankov", "https://github.com/golergka"]
- ["Darren Lin", "https://github.com/CogBear"]
- ["Alexandre Medeiros", "http://alemedeiros.sdf.org"]
- ["Denis Arh", "https://github.com/darh"]
- ["akirahirose", "https://twitter.com/akirahirose"]
- ["Anton Strömkvist", "http://lutic.org/"]
- ["Rahil Momin", "https://github.com/iamrahil"]
- ["Gregrory Kielian", "https://github.com/gskielian"]
filename: LearnBash-no.sh
translators:
- ["Andreas Lindahl Flåten", "https://github.com/anlif"]
lang: no-nb
---
Bash er navnet på unix skallet, som også var distribuert som skallet for GNU
operativsystemet og som standard skall på de fleste Linux distribusjoner og
macOS.
[Les mer her.](http://www.gnu.org/software/bash/manual/bashref.html)
```bash
#!/bin/bash
# Den første linjen i et bash skript starter med '#!' (shebang)
# etterfulgt av stien til bash http://en.wikipedia.org/wiki/Shebang_(Unix)
# Kommentarer starter med #.
# Enkelt hello world eksempel:
echo Hello world!
# Hver kommando starter på en ny linje, eller etter et semikolon:
echo 'Dette er den første linjen'; echo 'Dette er en andre linjen'
# Deklarering av en variabel ser slik ut:
VARIABLE="En tekststreng"
# Men ikke slik:
VARIABLE = "En tekststreng"
# Bash vil tolke dette som at VARIABLE er en kommando den skal kjøre
# og gi en feilmelding dersom kommandoen ikke finnes
# Bruk av den nydeklarerte variabelen:
echo $VARIABLE
echo "$VARIABLE"
echo '$VARIABLE'
# Når du bruker variabelen, for eksempel setter verdien eller eksporterer den,
# skriver du navnet dens uten $. Hvis du vil bruke variabelens verdi,
# skriver du $ før variabelnavnet.
# Strenginnhold i en variabel kan erstattes på følgende måte:
echo ${VARIABLE/tull/ball}
# Dette vil erstatte første forekomst av 'tull' med 'ball'
# Substreng av en variabel:
echo ${VARIABLE:0:7}
# Dette vil returnere de første 7 tegnene i en strengvariabel
# Å angi en standardverdi dersom en variabel er udeklarert gjøres slik:
echo ${FOO:-"StandardVerdiDersomFOOErTom"}
# Dette fungerer for null (FOO=), tom streng (FOO="") og tallet null (FOO=0)
# Det finnes en rekke hendige innebygde variable, eksempel:
echo "Siste programs returnerte verdi: $?"
echo "Skript's PID: $$"
echo "Antall argumenter: $#"
echo "Alle argumenter til skriptet: $@"
echo "Argumenter til skriptet i egne variable: $1 $2..."
# Lesing av input:
echo "Hva heter du?"
read NAME # variabelen NAME blir automatisk deklarert av 'read' kommandoen
echo Hei, $NAME!
# if setninger ser slik ut:
# se 'man test' for mer informasjon om betingelser
if [ $NAME -ne $USER ]
then
echo "Your name isn't your username"
else
echo "Your name is your username"
fi
# Det finnes også betinget eksekvering
echo "Kjøres alltid" || echo "Kjøres kun dersom første kommando feilet"
echo "Kjøres alltid" && echo "Kjøres kun dersom første kommando IKKE feilet"
# For å bruke && (logisk OG) og || (logisk ELLER) sammen med if setninger,
# trenger man par av firkantklammer [] på hver side av et logisk uttrykk:
if [ $NAME == "Steve" ] && [ $AGE -eq 15 ]
then
echo "Dette kjører dersom $NAME er Steve OG $AGE er lik 15."
fi
if [ $NAME == "Daniya" ] || [ $NAME == "Zach" ]
then
echo "Dette kjører dersom $NAME er Daniya ELLER Zach."
fi
# Matematiske uttrykk skrives slik:
echo $(( 10 + 5 ))
# Ulikt de fleste programmeringsspråk, så er bash et skall - det medfører at en
# kommando i et skript kjører i en bestemt mappe i filsystemet. Du kan skrive
# ut innholdet i nåværende mappe med ls kommandoen:
ls
# Kommandoen har parametre som kontrollerer hvordan kommandoen utføres:
ls -l # Skriv hver fil og mappe på sin egen linje
# Resultatet av forrige kommando kan bli sendt til neste kommando som input.
# grep kommandoen filtrerer input ved hjelp av et regulært uttrykk.
# Ved å bruke grep kan vi skrive ut kun .txt filer på følgende måte:
ls -l | grep "\.txt" # lær mer om grep ved å skrive 'man grep'
# Input og output fra filer kan dirigeres (stdin, stdout og stderr).
# 'cat' kommandoen uten argumenter skriver fra stdin til stdout.
# I det følgende eksempelet overskrives filen hello.py med linjene mellom EOF.
cat > hello.py << EOF
#!/usr/bin/env python
from __future__ import print_function
import sys
print("#stdout", file=sys.stdout)
print("#stderr", file=sys.stderr)
for line in sys.stdin:
print(line, file=sys.stdout)
EOF
# Kjør hello.py (et python skript)
# med ulike stdin, stdout, and stderr omdirigeringer:
python hello.py < "input.in"
python hello.py > "output.out"
python hello.py 2> "error.err"
python hello.py > "output-and-error.log" 2>&1
python hello.py > /dev/null 2>&1
# '>' operatoren overskriver filen dersom den finnes.
# Hvis du heller vil legge til på slutten av en eksisterende fil, bruk '>>'
python hello.py >> "output.out" 2>> "error.err"
# Overskriv output.txt, legg til error.err, og tell antall linjer med 'wc':
info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err
wc -l output.out error.err
# Run a command and print its file descriptor (e.g. /dev/fd/123)
# Kjør en kommando og print tilhørende 'file descriptor'
# se 'man fd'
echo <(echo "#helloworld")
# Ulike måter å overskrive output.out med '#helloworld':
cat > output.out <(echo "#helloworld")
echo "#helloworld" > output.out
echo "#helloworld" | cat > output.out
echo "#helloworld" | tee output.out >/dev/null
# Slett noen filer med økt verbositet '-v', legg til '-i' for interaktiv modus
rm -v output.out error.err output-and-error.log
# Kommandoer kan kjøres i deklarasjonen av andre kommandoer ved å bruke $( ):
# Følgende kommando skriver antall filer og mapper i nåværende mappe
echo "There are $(ls | wc -l) items here."
# Det samme kan gjøres med backticks `` men de kan ikke være nøstede,
# det anbefales å bruke $( ) slik som i forrige eksempel.
echo "There are `ls | wc -l` items here."
# Bash har en 'case' setning som fungerer omtrent som en 'switch' i Java/C:
case "$VARIABLE" in
# Skriv ønskede match med tilhørende kommandoer
0) echo "There is a zero.";;
1) echo "There is a one.";;
*) echo "It is not null.";;
esac
# for løkker kan iterere over en mengde argumenter:
for VARIABLE in {1..3}
do
echo "$VARIABLE"
done
# Eller vi kan skrive en for løkke omtrent slik det kan gjøres i Java/C:
for ((a=1; a <= 3; a++))
do
echo $a
done
# Man kan også iterere over resultatet av en annen kommando.
for OUTPUT in $(ls)
do
cat "$OUTPUT"
done
# while løkke, se if setninger:
while [ true ]
do
echo "loop body here..."
break
done
# Man kan også definere funksjoner.
# Definisjon:
function foo ()
{
echo "Argumenter fungerer akkurat som skript argumenter: $@"
echo "Og: $1 $2..."
echo "Dette er en funksjon"
return 0
}
# eller bare:
bar ()
{
echo "En annen måte å deklarere en funksjon."
return 0
}
# Å kalle en funksjon:
foo "Mitt navn er" $NAME
# Det er mange nyttige kommandoer du bør lære deg:
# "tail" skriver ut slutten av en fil, i dette tilfellet de siste 10 linjene
tail -n 10 file.txt
# skriv ut de første 10 linjene av file.txt
head -n 10 file.txt
# sorter linjene i file.txt ("man sort")
sort file.txt
# skriv ut eller fjern repeterte linjer, med -d skrives de ut
uniq -d file.txt
# skriver kun den første kolonnen før ',' tegnet
cut -d ',' -f 1 file.txt
# erstatter hvert tilfelle av 'bjarne' med 'alfa' i file.txt,
# sed støtter regulære uttrykk ("man sed").
sed -i 's/bjarne/alfa/g' file.txt
# skriv til stdout alle linjer i file.txt som matches av et regulært uttrykk
# eksempelet skriver ut alle linjer som begynner med "foo" og slutter med "bar"
grep "^foo.*bar$" file.txt
# skriv "-c" hvis du heller vil vite antall linjer som matcher
grep -c "^foo.*bar$" file.txt
# hvis du vil matche en bestemt streng, og ikke et regulært uttrykk
# bruker du enten "fgrep" eller ekvivalenten "grep -f"
fgrep "^foo.*bar$" file.txt
# Les Bash sin egen dokumentasjon om innebygde konstruksjoner:
help
help help
help for
help return
help source
help .
# Les Bash sin "manpage":
apropos bash
man 1 bash
man bash
# Les "info" dokumentasjon:
apropos info | grep '^info.*('
man info
info info
info 5 info
# Les bash sin info dokumentasjon:
info bash
info bash 'Bash Features'
info bash 6
info --apropos bash
```
|