abonnement Unibet Coolblue
pi_56019425
Welkom in het centrale shell scripting topic.

Als je vragen hebt over shell scripting, dan zit je hier goed. Hier zitten idioten die verstand denken te hebben van shell scripting en je helpen om leuke nifty scriptjes te maken in de unix shell.

Mocht je een probleem hebben met je code, post deze dan even. We kunnen anders niet zien wat je precies aan het doen bent.

Nieuw met shell scripting?
Voor mensen die nieuw zijn in shell scripting, die raad ik aan om de introductie te lezen en de bash tutorial eens door te lezen. Als je wilt beginnen maakt het eigenlijk niet uit welke shell je wilt gebruiken, bash, zsh, ksh, csh, etc, etc, ze doen allemaal hetzelfde namelijk, je interface op de commandline zijn. Als je begint is het handig om bash te leren, aangezien het zeer goede documentatie heeft. Maar de andere shells worden ook actief gebruikt. In het kort, pick any, en maak daarna de eventuele overstap naar een andere shell (altijd leuk om een andere shell te leren ).

* Shell HOWTO in het Nederlands
* Een intro in shell scripting (bash)

Het portable maken van scripts
Als je een script portable maakt moet je rekening houden dat je niet altijd overal de GNU versies van verschillende applicaties hebt, dat betekend dus dat je bijvoorbeeld `sed -i' niet kan uitvoeren, en dus een andere manier hiervoor moet vinden.
Ook kan het inhouden dat je code onder andere shell talen komt te draaien. Houd hier rekening mee in je code. Op Solaris bijvoorbeeld kan je in een script die /bin/sh aanroept geen bash specifieke functies aanroepen, of syntax gebruiken. Solaris gebruikt in tegenstelling tot Linux de echte born shell. Over Solaris gesproken (en andere distro's), implementaties van sommige functies heten anders (truss en strace, tcpdump en snoop bijvoorbeeld) of hebben een andere parameters. Maar voor vragen daarover kan je in [Linux/Unix] [/Gurus/helpen/newbies]$ ./deel zoveel topic terecht (de link wijst overigens naar de wiki, daar staat namelijk de correcte URL naar het laatste topic).

Welke shell gebruik ik nou?

Welke shell je gebruikt staat in het /etc/passwd bestand. Er is een omgevings variabele SHELL die aangeeft welke shell in het wachtwoordbestand staat. Om deze variabele op te vragen moet je hetvolgende doen.

1
2
3
4
5
echo $SHELL
# Of
env | grep SHELL
# en ter overbodigheid
grep username /etc/passwd | awk -F\/ '{print $NF}'


Dit is echter geen garantie dat je ook daadwerkelijk de shell draait waar je op dat moment mee werkt. Kijk maar:

1
2
3
4
#zsh is mijn standaard shell
$ bash
$ echo $SHELL
/bin/zsh


Om er dan achter te komen welke shell je echt draait, kan je dit uitvoeren:
1echo `ps -p $$` 


Tips and tricks
Ergens verstopt (lees, op dit moment nog nergens te vinden) in wiki staat er een handige pagina met shell functies die jou kunnen helpen. Deze zijn afkomstig uit o.a. Het linux n00bs en guru's topic, of komen uit deze topicreeks.

Meer over de shell(s)
* GNU bash
* Zeer uitgebreide bash tutorial, ook handig als referentiemateriaal
* Bash reference manual
* Bourne/Korn Shell coding conventies (OpenSolaris)
* Zsh user guide
* Alleen maar shell scripting.. (forum)

Mocht je meer vragen hebben over shell scripting, op eu.freenode.org heb je verschillende kanalen, waaronder #bash. #zsh en andere #shells zullen ook wel bestaan.

Deze OP en instructies voor nieuw topic: http://wiki.fok.nl/index.php/OP/DIG/centraal/bash
Mocht je een link vinden die zeker in de OP hoort, twijfel niet en zet hem erbij!

Big fucking warning
Ga nooit "leuk" zijn en mensen vertellen dat ze rm -rf /, moeten uitvoeren, dit wordt ZWAAR bestraft door de mods @hier en terecht. Voor de mensen die niet precies weten wat dit doet: rm -rf is een recursive, geforcede delete (rm == remove) actie op de root van je systeem. Mocht je als root zijn ingelogd dan verwijder je alle bestanden van je systeem en zal je snel merken dat je PC niet meer boot en je al je data kwijt bent. Mocht je een gewone user zijn en dit uitvoeren, dan heb je grote kans dat je homedir pleitte is, en andere bestanden buiten je $HOME, waar jij de eigenaar voor bent en/of group schrijfrechten voor hebt. Voer dit daarom dan ook NOOIT uit (tenzij je pijn leuk vind of als je in een virtuele omgeving zit waar dataverlies niet uitmaakt). Als we een post vinden waarin we dit zien, kijk er dan niet raar vanop dat je niet meer kan posten in DIG, of op heel Fok for that matter. U bent gewaarschuwd!

[ Bericht 8% gewijzigd door slacker_nl op 14-01-2008 18:04:05 ]
In theory there is no difference between theory and practice. In practice there is.
  maandag 14 januari 2008 @ 11:48:51 #2
65490 whoops
Home is where the heart is...
pi_56019977
1
2
3
4
5
6
7
#!/bin/bash
CHARS=(t v p)
for C in ${CHARS[@]}
do
    echo -n $C
done
echo ''


In the beginning, the universe was created. This made a lot of people very angry and has been widely regarded as a bad move.
  maandag 14 januari 2008 @ 12:11:53 #3
126003 Daniel1976
de omnibus dubitandum
pi_56020533
-edit-

[ Bericht 83% gewijzigd door Sander op 14-01-2008 12:52:19 ]
  maandag 14 januari 2008 @ 12:12:20 #4
126003 Daniel1976
de omnibus dubitandum
pi_56020542
--

[ Bericht 93% gewijzigd door Sander op 14-01-2008 16:06:55 ]
  maandag 14 januari 2008 @ 12:14:36 #5
17137 Sander
Nerds do it rarely
pi_56020595
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
  maandag 14 januari 2008 @ 12:51:17 #6
65490 whoops
Home is where the heart is...
pi_56021488
quote:
Op maandag 14 januari 2008 12:11 schreef Daniel1976 het volgende:
apt-get install humor?
In the beginning, the universe was created. This made a lot of people very angry and has been widely regarded as a bad move.
pi_56021547
quote:
Op maandag 14 januari 2008 12:14 schreef Slarioux het volgende:
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
Daarbij zijn dat commando's die zo ontzettend zielig zijn om te roepen in dit soort topics.

Interessant topic, deze reactie tevens als TVP.
The past is what made you, but the future is what you're gonna make!
pi_56021584
quote:
Op maandag 14 januari 2008 12:14 schreef Slarioux het volgende:
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
nee, dit kost je postrechten:

DUS NIET UITVOEREN APEN!!

[ Bericht 1% gewijzigd door Sander op 14-01-2008 13:14:04 (niet doen) ]
In theory there is no difference between theory and practice. In practice there is.
  maandag 14 januari 2008 @ 15:06:44 #9
84926 WyriHaximus
Release the hounds smithers!
pi_56024615
Zo ook maar ff een TVPtje maken .
phluphy for president!
  maandag 14 januari 2008 @ 15:46:47 #10
187069 slacker_nl
Sicko pur sang
pi_56025420
quote:
Op maandag 14 januari 2008 12:54 schreef slacker_nl het volgende:
nee, dit kost je postrechten:
mietje slar
In theory there is no difference between theory and practice. In practice there is.
pi_56072494
quote:
Op maandag 14 januari 2008 11:48 schreef whoops het volgende:

[ code verwijderd ]

Wat doet 't ofzo? Ik ken niks van code dus zou wel graag weten wat 't is voor ik 't eens uitprobeer
  woensdag 16 januari 2008 @ 13:57:51 #12
65490 whoops
Home is where the heart is...
pi_56072601
quote:
Op woensdag 16 januari 2008 13:52 schreef tony_clifton- het volgende:

[..]

Wat doet 't ofzo? Ik ken niks van code dus zou wel graag weten wat 't is voor ik 't eens uitprobeer
Deze code print de letters TVP op je console.

Om dit de draaien moet je die code in een bestand opslaan (bijvoorbeeld filename.sh), dan met de terminal naar de directory waar het in staat en dan 'chmod +x filename.sh', en uitvoeren door ./filename.sh uit te voeren.
In the beginning, the universe was created. This made a lot of people very angry and has been widely regarded as a bad move.
pi_56073096
Ah k
ingewikkeld!
  woensdag 16 januari 2008 @ 16:06:51 #14
187069 slacker_nl
Sicko pur sang
pi_56076030
quote:
Op woensdag 16 januari 2008 13:57 schreef whoops het volgende:

[..]

Deze code print de letters TVP op je console. :)

Om dit de draaien moet je die code in een bestand opslaan (bijvoorbeeld filename.sh), dan met de terminal naar de directory waar het in staat en dan 'chmod +x filename.sh', en uitvoeren door ./filename.sh uit te voeren.
Niet perse natuurlijk, deze code kan je ook gewoon in terminal inkloppen en dan moet het ook werken. Maar in een file is het idd makkelijker, vooral als je moet gaan editten :)

Doe dit maar eens in een terminal:

enter() { echo "Enter the shell" }

en dan `which enter'

1
2
3
4
5
6
7
8
16:03 pts/9 0 wesleys@eniac:/home/wesleys$ enter() { echo "Enter the shell" }
16:03 pts/9 0 wesleys@eniac:/home/wesleys$ which enter
enter () {
        echo "Enter the shell"
}
16:03 pts/9 0 wesleys@eniac:/home/wesleys$ enter
Enter the shell
16:03 pts/9 0 wesleys@eniac:/home/wesleys$
In theory there is no difference between theory and practice. In practice there is.
  donderdag 17 januari 2008 @ 12:48:54 #15
65490 whoops
Home is where the heart is...
pi_56100073
quote:
Op woensdag 16 januari 2008 14:17 schreef tony_clifton- het volgende:
Ah k
ingewikkeld!
De makkelijkste manier om dit te doen is overigens zo:

echo TVP

maar ik vond het leuk om een array met letters te maken, en deze 1 voor 1 uit te spugen.
In the beginning, the universe was created. This made a lot of people very angry and has been widely regarded as a bad move.
pi_56145338
even een tvp want dit is verdomdig handig.
pi_56705298
Een todo manager volledig in bash geschreven. Zie filmpje op de site voor de werking ervan. Het script zelf zit vol met sed commando's. Dus als je wilt debuggen, enjoy

http://todotxt.com/library/todo.sh/
In theory there is no difference between theory and practice. In practice there is.
  woensdag 18 juni 2008 @ 22:48:16 #18
65490 whoops
Home is where the heart is...
pi_59503393
Bashers!

Ik heb het volgende stuk code:

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
#!/bin/bash

# Define backtitle
BACKTITLE="Nice message you got here!"

# Define header text
HEADER="This text acts like a header!"

# Define box format, Height, Width, List Height
SIZE_H=20
SIZE_W=50
SIZE_L=30

dialog --backtitle "$BACKTITLE" --checklist "$HEADER" $SIZE_H $SIZE_W $SIZE_L \
      "Choice 1" "Description One!"       ON  \
      "Choice 2" "Second Description!"    ON  \
      "Choice 3" "Third and Last!"       OFF \
      2> /tmp/checklist.tmp.$$

retval=$?

choice=`cat /tmp/checklist.tmp.$$`
rm -f /tmp/checklist.tmp.$$

case $retval in
  0)
    if [ -n "$choice" ]
    then
        echo "You chose: $choice"
    else
        echo "Can't choose?"
    fi;; 
  1)
    echo "Cancel pressed.";;
  255)
    echo "ESC pressed.";;
esac


Deze code print een lijst met keuzes d.m.v. Dialog. Dit werkt prima zo.

Ik zou echter graag de opties variabel willen maken, en dit lukt me niet. Ik heb al geprobeerd om de opties in een variabele te zetten, en deze als parameter van het dialog commando mee te geven, maar dat levert niet het gewenste resultaat op...

Anyone any clues?
In the beginning, the universe was created. This made a lot of people very angry and has been widely regarded as a bad move.
  donderdag 19 juni 2008 @ 01:21:34 #19
187069 slacker_nl
Sicko pur sang
pi_59507613
Ff dit aanpassen in je voorbeeld, anders kan ik die checklist dialog niet maken..

1
2
3
4
# Define box format, Height, Width, List Height
SIZE_H=20
SIZE_W=50
SIZE_L=3
In theory there is no difference between theory and practice. In practice there is.
  donderdag 19 juni 2008 @ 01:41:55 #20
187069 slacker_nl
Sicko pur sang
pi_59507810
Gebruik van arrays :)

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
#!/bin/bash

# Define backtitle
BACKTITLE="'Nice message you got here!'"

# Define header text
HEADER="'This text acts like a header!'"

# Define box format, Height, Width, List Height
SIZE_H=20
SIZE_W=50
#SIZE_L=3

choices[0]="'Choice 1' 'Description one!' ON"
choices[1]="'Choice 2' 'Description two!' ON"
choices[2]="'Choice 3' 'Description three!' OFF"
choices[3]="'Choice 4' 'Description four!' ON"
choices[4]="'Choice 5' 'Description five!' ON"

SIZE_L=${#choices[@]}

for ((a=0; a < SIZE_L ; a++)); do
    line="$line ${choices[$a]}"
done

choice=$(eval dialog --stdout --backtitle $BACKTITLE --checklist $HEADER $SIZE_H $SIZE_W $SIZE_L $line);

retval=$?

case $retval in
  0)
    if [ -n "$choice" ]
    then
        echo "You chose: $choice"
    else
        echo "Can't choose?"
    fi;;
  1)
    echo "Cancel pressed.";;
  255)
    echo "ESC pressed.";;
esac
In theory there is no difference between theory and practice. In practice there is.
  donderdag 19 juni 2008 @ 09:58:42 #21
65490 whoops
Home is where the heart is...
pi_59510892
Thanks dude, hier kan ik zeker wel wat mee...
In the beginning, the universe was created. This made a lot of people very angry and has been widely regarded as a bad move.
  dinsdag 24 juni 2008 @ 18:45:42 #22
65490 whoops
Home is where the heart is...
pi_59657297
Ik heb 2 vragen.

1: is er een makkelijkere manier om $i met 1 op te hogen?

1i=`echo $((i+1))`


2: In onderstaande code wil ik een dot-file uit m'n homedir inlezen, ik kan deze waarde echter niet variabel maken. Hoe krijg ik dat voor elkaar?

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

CONFIG_FILE_A='/home/whoops/.server-control'
CONFIG_FILE_B='~/.server-control'

echo $CONFIG_FILE_A
echo $CONFIG_FILE_B

if [ -f "$CONFIG_FILE_A" ]; then echo "A exists"; fi
if [ -f "$CONFIG_FILE_B" ]; then echo "B exists"; fi
In the beginning, the universe was created. This made a lot of people very angry and has been widely regarded as a bad move.
  dinsdag 24 juni 2008 @ 19:24:09 #23
187069 slacker_nl
Sicko pur sang
pi_59658032
quote:
Op dinsdag 24 juni 2008 18:45 schreef whoops het volgende:
Ik heb 2 vragen.

1: is er een makkelijkere manier om $i met 1 op te hogen?
[ code verwijderd ]
Je haalt nu twee dingen door elkaar;

i=`expr $i + 1`

en

i=$((i + 1))

Die echo is niet noodzakelijk in beide gevallen.
quote:
2: In onderstaande code wil ik een dot-file uit m'n homedir inlezen, ik kan deze waarde echter niet variabel maken. Hoe krijg ik dat voor elkaar?

[ code verwijderd ]
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

CONFIG_FILE_A="$HOME/.env.local"
CONFIG_FILE_B="~/.env.local"

for i in $CONFIG_FILE_A $CONFIG_FILE_B ; do
    if [ -f "$i" ]; then
        echo "'$i' exists";
        # Pick any
        . $i 
        source $i 
    fi
done


B pakt ie niet, maar dat komt wellicht omdat ie tijdens de test geen ~ expand naar je homedir, makkelijke workaround is $HOME gebruiken.. Zoals dus bij A gebeurd.
In theory there is no difference between theory and practice. In practice there is.
  dinsdag 24 juni 2008 @ 19:44:17 #24
147503 Iblis
aequat omnis cinis
pi_59658469
quote:
Op donderdag 19 juni 2008 01:41 schreef slacker_nl het volgende:
Gebruik van arrays
[ code verwijderd ]
Dit is overigens heel erg niet-portable naar ‘sh’ op deze manier. Als je een shell-script moet maken dat onder sh werkt, kun je dit niet gebruiken (daar heb je andere trucs voor, met eval, maar daar begin ik liever niet over.)
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  dinsdag 24 juni 2008 @ 19:47:11 #25
187069 slacker_nl
Sicko pur sang
pi_59658536
quote:
Op dinsdag 24 juni 2008 19:44 schreef Iblis het volgende:

[..]

Dit is overigens heel erg niet-portable naar ‘sh’ op deze manier. Als je een shell-script moet maken dat onder sh werkt, kun je dit niet gebruiken (daar heb je andere trucs voor, met eval, maar daar begin ik liever niet over.)
Nu weet ik dat whoops 99,9% bash code schrijft, en ik weet ook dat ie in 99,99% geen sh compatible code nodig heeft

Maar hoe zou je dit, voor de lol, in sh compatibel code willen doen dan?

[ Bericht 5% gewijzigd door slacker_nl op 24-06-2008 19:56:14 ]
In theory there is no difference between theory and practice. In practice there is.
abonnement Unibet Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')