[bash-scripting] ed in script gaat mis

Pagina: 1
Acties:

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoi


ik heb wat bestandjes (voor een mail-setup op mysql, met 8x hetzelfde usertje en password).
Ik wil die bestanden met een bash-script aanpassen.... in de bron versie staat er dan dbUser.script op de plek van de nieuwe user, en dbPass.script als pass etc etc.

Ik heb het book Unix power tools van O'Reilly erbij gepakt, en daarr staat deze setup:
code:
1
2
3
4
5
6
7
for file in *html;
do
ed $file <<EOF
1,\$s/$old_graphics_dir/$new_graphics_dir./g
w
EOF
done


Dat script is bedoeld om een pad in een stel html bestanden te vervangen. Ik doe opzich precies hetzelfde:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

dbUser=$1
dbPass=$2
domainNames=$3
db="mailsql"

generateMysqlFiles()
{
        for file in mysql*.cf;
        do
                ed  $file <<EOF
                1,\$s/dbUser.script/$dbUser/g
                1,\$s/dbPass.script/$dbPass/g
                1,\$s/db.script/$db/g
        w
        EOF
        done

}

generateMysqlFiles

Alleen geeft vim al meteen aan dat er bij het eerste ed commando een en ander mis gaat --> vanaf 1,\$ is de zaak rood.

Ook geeft het script de error bij:
code:
1
2
boudewijn@mail ~/mail-install $ sh installMail.sh user pass abc
installMail.sh: line 23: syntax error: unexpected end of file

Line 23 is dus na de lus... hij pakt ergens die rest van de lus als input voor ed mee gok ik.
Google werkte hier niet echt, en wat boeken (heb ook Learning the bash shell van O'Reilly) boden geen uitkomst.

Iemand weet wat ik fout doe? (vast wel :+)

Zaram module kopen voor je glasvezelaansluiting?


  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07-2025
Zoveel verstand heb ik niet van bash scripting, maar als ik de code uit de functie haal en de functie gewoon weghaal doet ie het wel gewoon..

Beetje nutteloos ook lijkt me om een functie te schrijven :?

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


  • xzenor
  • Registratie: Maart 2001
  • Laatst online: 14-10-2022

xzenor

Ja doe maar. 1 klontje suiker.

OxiMoron schreef op woensdag 31 mei 2006 @ 10:55:
Beetje nutteloos ook lijkt me om een functie te schrijven :?
Jij ziet maar een klein stukje van de code he....

Als je 15 keer dat stukje code moet herhalen is het handiger om het in een function te zetten.

EDIT: zet eens een q als laatste commadno voor ed
dat is quit. Dus dan 'kan' de rest van het script niet eens meer meegenomen worden want ed is dan al afgesloten.

[ Voor 22% gewijzigd door xzenor op 31-05-2006 11:46 ]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
possamai schreef op woensdag 31 mei 2006 @ 11:35:

EDIT: zet eens een q als laatste commadno voor ed
dat is quit. Dus dan 'kan' de rest van het script niet eens meer meegenomen worden want ed is dan al afgesloten.
Het aanpassen van de commando's voor ed verandert niks aan de syntax error die bash genereert.

Het probleem zit hem in de EOF, als je die aan het begin van de regel zet werkt het wel.

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
hmm dat zullen we dan zo eens proberen :)

Zaram module kopen voor je glasvezelaansluiting?


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
blaataaps schreef op woensdag 31 mei 2006 @ 11:55:
[...]

Het aanpassen van de commando's voor ed verandert niks aan de syntax error die bash genereert.

Het probleem zit hem in de EOF, als je die aan het begin van de regel zet werkt het wel.
Blaataaps: ik snap niet helemaal wat je bedoelt, ik doe nu dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
boudewijn@mail ~/mail-install $ cat installMail.sh
#!/bin/bash

dbUser=$1
dbPass=$2
domainNames=$3
db="mailsql"

generateMysqlFiles()
{
        for file in mysql*.cf;
        do
                ed  $file
                EOF
                1,\$s/dbUser.script/$dbUser/g
                1,\$s/dbPass.script/$dbPass/g
                1,\$s/db.script/$db/g
        w
        EOF
        done

}
generateMysqlFiles


Dit gaat echter goed fout: :7
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
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
boudewijn@mail ~/mail-install $ sh installMail.sh a b
202

?
installMail.sh: line 13: EOF: command not found
installMail.sh: line 14: 1,$s/dbUser.script/a/g: No such file or directory
installMail.sh: line 15: 1,$s/dbPass.script/b/g: No such file or directory
installMail.sh: line 16: 1,$s/db.script/mailsql/g: No such file or directory
 21:53:33 up  5:06,  2 users,  load average: 0.23, 0.19, 0.08
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
boudewij pts/0     21:27   17:14   0.00s  0.01s sshd: boudewijn [priv]
boudewij pts/1     21:44   11.00s  0.00s  0.00s sh installMail.sh a b
installMail.sh: line 18: EOF: command not found
199
installMail.sh: line 13: EOF: command not found
installMail.sh: line 14: 1,$s/dbUser.script/a/g: No such file or directory
installMail.sh: line 15: 1,$s/dbPass.script/b/g: No such file or directory
installMail.sh: line 16: 1,$s/db.script/mailsql/g: No such file or directory
 21:53:34 up  5:06,  2 users,  load average: 0.23, 0.19, 0.08
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
boudewij pts/0     21:27   17:15   0.00s  0.01s sshd: boudewijn [priv]
boudewij pts/1     21:44   12.00s  0.00s  0.00s sh installMail.sh a b
installMail.sh: line 18: EOF: command not found
200
installMail.sh: line 13: EOF: command not found
installMail.sh: line 14: 1,$s/dbUser.script/a/g: No such file or directory
installMail.sh: line 15: 1,$s/dbPass.script/b/g: No such file or directory
installMail.sh: line 16: 1,$s/db.script/mailsql/g: No such file or directory
 21:53:34 up  5:06,  2 users,  load average: 0.23, 0.19, 0.08
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
boudewij pts/0     21:27   17:15   0.00s  0.01s sshd: boudewijn [priv]
boudewij pts/1     21:44   12.00s  0.00s  0.00s sh installMail.sh a b
installMail.sh: line 18: EOF: command not found
239
installMail.sh: line 13: EOF: command not found
installMail.sh: line 14: 1,$s/dbUser.script/a/g: No such file or directory
installMail.sh: line 15: 1,$s/dbPass.script/b/g: No such file or directory
installMail.sh: line 16: 1,$s/db.script/mailsql/g: No such file or directory
 21:53:35 up  5:06,  2 users,  load average: 0.23, 0.19, 0.08
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
boudewij pts/0     21:27   17:16   0.00s  0.01s sshd: boudewijn [priv]
boudewij pts/1     21:44   13.00s  0.00s  0.00s sh installMail.sh a b
installMail.sh: line 18: EOF: command not found
242
installMail.sh: line 13: EOF: command not found
installMail.sh: line 14: 1,$s/dbUser.script/a/g: No such file or directory
installMail.sh: line 15: 1,$s/dbPass.script/b/g: No such file or directory
installMail.sh: line 16: 1,$s/db.script/mailsql/g: No such file or directory
 21:53:35 up  5:06,  2 users,  load average: 0.21, 0.19, 0.08
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
boudewij pts/0     21:27   17:16   0.00s  0.01s sshd: boudewijn [priv]
boudewij pts/1     21:44   13.00s  0.00s  0.00s sh installMail.sh a b
installMail.sh: line 18: EOF: command not found
242
installMail.sh: line 13: EOF: command not found
installMail.sh: line 14: 1,$s/dbUser.script/a/g: No such file or directory
installMail.sh: line 15: 1,$s/dbPass.script/b/g: No such file or directory
installMail.sh: line 16: 1,$s/db.script/mailsql/g: No such file or directory
 21:53:36 up  5:06,  2 users,  load average: 0.21, 0.19, 0.08
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
boudewij pts/0     21:27   17:17   0.00s  0.01s sshd: boudewijn [priv]
boudewij pts/1     21:44   14.00s  0.00s  0.00s sh installMail.sh a b
installMail.sh: line 18: EOF: command not found
196
installMail.sh: line 13: EOF: command not found
installMail.sh: line 14: 1,$s/dbUser.script/a/g: No such file or directory
installMail.sh: line 15: 1,$s/dbPass.script/b/g: No such file or directory
installMail.sh: line 16: 1,$s/db.script/mailsql/g: No such file or directory
 21:53:36 up  5:06,  2 users,  load average: 0.21, 0.19, 0.08
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
boudewij pts/0     21:27   17:17   0.00s  0.01s sshd: boudewijn [priv]
boudewij pts/1     21:44   14.00s  0.00s  0.00s sh installMail.sh a b
installMail.sh: line 18: EOF: command not found


Ik moet hem bij elke nieuw blokje keihard ctrl-d'en --> dat is niet de bedoeling.


offtopic:
Ja ik gebruik een functie omdat die variabelen gewoon telkens gaan verspringen; ik wil nog wat meer dingen omzetten en het is sowieso wel handige yank-paste functie

Zaram module kopen voor je glasvezelaansluiting?


  • Paul
  • Registratie: September 2000
  • Laatst online: 06-02 18:11
Boudewijn schreef op woensdag 31 mei 2006 @ 21:52:
Blaataaps: ik snap niet helemaal wat je bedoelt
blaataaps schreef op woensdag 31 mei 2006 @ 11:55:
Het probleem zit hem in de EOF, als je die aan het begin van de regel zet werkt het wel.
Heel veel simpeler dan dat lukt het mij ook niet hoor?
Er staat: "Haal de tabs/spaties/etc voor de EOF weg"

:P

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
okay de EOF op regel 19.
Wazig zeg dat hij daar dan over struikelt.

En sowieso: O'Reilly geeft het ook zo ge-indentured aan (okay, ze zijn niet heilig maar best goed).
We gaan eens proberen

Zaram module kopen voor je glasvezelaansluiting?


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
zelfde probleem nog steeds hoor ;)

ik heb nu alle indenturing verwijderd, maar hij moet nog steeds ctrl-d hebben :(

en dat werkt dus niet echt sexy.

Zaram module kopen voor je glasvezelaansluiting?


Verwijderd

Als je een mintekentje achter de << zet mag je het hele here-document (het blok van <<EOF tot de afsluitende EOF met tabs laten inspringen (spaties tellen wel). Dus:
code:
1
2
3
4
5
6
7
8
9
command
command

<tab>ed $file <<-EOF
<tab><tab>1,\$s/$old_graphics_dir/$new_graphics_dir./g
<tab><tab>more ed-commands
<tab>EOF

command

Tijdens de uitvoering van het script worden de inspringende tabs tussen de 2 EOFs gestript.

Ik zou zelf sed gebruiken voor het vervangen, zo ongeveer:
code:
1
2
3
4
5
sed -i "
      s/dbUser.script/$dbUser/g
      s/dbPass.script/$dbPass/g
      s/db.script/$db/g
" mysql*.cf

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

3x < gebruiken ipv 2

dus:
code:
1
ed $file <<<EOF

[ Voor 31% gewijzigd door eghie op 01-06-2006 11:28 ]


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
die ga ik allebei zo eens proberen :)

ziet er veelbelovend uit, heren.

Zaram module kopen voor je glasvezelaansluiting?


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
yay de sed optie werkt prima :)
bedankt voor de hint.

eghie's truc zal ik straks ook eens proberen; die lijkt me ook wel handig.

Zaram module kopen voor je glasvezelaansluiting?


Verwijderd

eghie schreef op donderdag 01 juni 2006 @ 10:38:
3x < gebruiken ipv 2

dus:
code:
1
ed $file <<<EOF
'<<<' is een here string, min of meer equivalent met
code:
1
echo EOF | ed $file

Dan zou je het ed-scriptje ipv EOF als string aan ed moeten doorgeven.

De (sed -i "s/var/$var/" files)-oplossing is volgens mij de kortste en meest elegante oplossing, heb je ook geen for-loop nodig.
Pagina: 1