[smbldap-useradd/shellscript] variabele met spaties

Pagina: 1
Acties:

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 08:30
Ik heb (beetje quick 'n' dirty) het volgende scriptje in elkaar gedraaid om op een basisschool leerlingen in de SAMBA-LDAP database te zetten, door de namen van de leerlingen onder elkaar in een tekstbestandje te zetten.
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
74
75
76
77
78
#!/bin/sh

groep=8

##############################################

let gid=${groep}+40000
namenLijst=groep-${groep}.txt
aantalNamen=$(cat ${namenLijst} | sed -n '$=')

echo

for i in $(seq 1 ${aantalNamen});
do      

naam=$(head -${i} ${namenLijst} | tail -1)
voornaam=$(echo ${naam} | cut -d" " -f1);
achternaam=$(echo ${naam} | cut -d" " -f2-);
an1=$(echo ${achternaam} | cut -d" " -f1);
an2=$(echo ${achternaam} | cut -d" " -f2);
an3=$(echo ${achternaam} | cut -d" " -f3);
an4=$(echo ${achternaam} | cut -d" " -f4);
elan1=$(echo $an1 | head -c1);
elan2=$(echo $an2 | head -c1);
elan3=$(echo $an3 | head -c1);
elan4=$(echo $an4 | head -c1);

echo ${naam}

if [ "${elan4}" = "${elan3}" ]; 
then eersteLettersAchternaam=${elan1}${elan2}${elan3}; 
else eersteLettersAchternaam=${elan1}${elan2}${elan3}${elan4}; 
fi

if [ "${elan3}" = "${elan2}" ]; 
then eersteLettersAchternaam=${elan1}${elan2}; 
else eersteLettersAchternaam=${elan1}${elan2}${elan3}; 
fi

if [ "${elan2}" = "${elan1}" ]; 
then eersteLettersAchternaam=${elan1}; 
else eersteLettersAchternaam=${elan1}${elan2}; 
fi          

achternaamZonderSpaties=$(echo ${achternaam} | tr ' ' -d)
gebruikersnaam=$(echo ${voornaam}${eersteLettersAchternaam} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz');
    
uidVN=$(echo ${voornaam} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-' '246824682468246824682468242' | tr 'abcdefghijklmnopqrstuvwxyz' '24682468246824682468246824')
uidAN=$(echo ${achternaamZonderSpaties} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-' '246824682468246824682468242' | tr 'abcdefghijklmnopqrstuvwxyz' '24682468246824682468246824' | head -c7)
    
uidpreGN=$(echo ${gebruikersnaam} | tr 'qwertyuiopasdfghjklzxcvbnm-' '246824682468246824682468242' | tail -c10)
    
let uidGN=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" ")*${uidpreGN}

while [ 15000000 -le ${uidVN} ]; do let uidVN=${uidVN}/2; done
while [ 35000000 -le ${uidAN} ]; do let uidAN=${uidAN}/2; done
while [ 999999 -le ${uidGN} ]; do let uidGN=${uidGN}/4; done

let preuid=(2*${uidVN}+${uidAN}+3*${uidGN})/2
let uid=(${preuid}/666*${preuid})/616

while [ 1500000000 -le ${uid} ]; do let uid=${uid}/4; done
while [ ${uid} -le 50001 ]; do let uid=${uid}*6; done
while [ 1500000000 -le ${uid} ]; do let uid=${uid}/2; done

shell=/bin/false
home=/home/${gid}/${gebruikersnaam}
skeldir=/etc/skel-${gid}

    ##############################################

echo ${naam} '('${voornaam} ${achternaam}')' krijgt gebruikersnaam ${gebruikersnaam} toegewezen 
echo en komt als ID${uid} in de database te staan.
echo

/usr/sbin/smbldap-useradd -u ${uid} -g ${gid} -d ${home} -s ${shell} -c ${naam} -S ${voornaam} ${gebruikersnaam}

done;

Het hele principe werkt, op één ding na: ook de volledige naam van de leerling moet in de datbase komen (gecos noemt smbldap-useradd het) zodat die in Menu Start kan verschijnen en later nog voor andere doeleinden gebruikt kan worden. Het punt is dat mijn variabele die de/het(?) gecos doorgeeft niet goed wordt geïnterpreteerd door smbldap-useradd. De naam bevat namelijk spaties en ik denk dat hij daardoor over z'n nek gaat. (Als ik de naam hard in het bestand zet met aanhalingstekens eromheen gaat het wél goed). Ik heb al vanalles geprobeerd zoals zelfs het faken van aanhalingstekens (-c $(echo "'"${naam}"'") maar dat resulteert alleen in alleen het laatste deel van de naam, danwel dat laatste deel met een apostrof erna tot zelfs letterlijk $naam. Suggesties?

[ Voor 7% gewijzigd door Z-Dragon op 05-03-2006 11:31 . Reden: If-voorwaarde onder elkaar gezet ten behoeve van overzichtelijkheid ]

^ Wat hij zegt.


  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Als ik het goed begrijp wil je een aanhalingsteken meegeven aan een commando, maar wordt die opgegeten door de shell. In dat geval moet je het teken escapen met een backslash. Voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
#!/bin/sh
naam="Jan de Vries"
voornaam=$(echo ${naam} | cut -d" " -f1);
achternaam=$(echo ${naam} | cut -d" " -f2-);
echo ${naam}
echo \"${naam}\"
echo ${voornaam}
echo \"${voornaam}\"
echo ${achternaam}
echo \"${achternaam}\"

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 08:30
De opdracht wordt daar inderdaad correct mee, maar het resultaat is nog steeds niet wat ik van hem wil. (onveranderd)

^ Wat hij zegt.


  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Z-Dragon schreef op maandag 06 maart 2006 @ 18:42:
De opdracht wordt daar inderdaad correct mee, maar het resultaat is nog steeds niet wat ik van hem wil. (onveranderd)
Vreemd hoor, in je TS schrijf je immers dat het wel goed werkt als je ipv een variabele de naam zelf neerzet inclusief de aanhalingstekens.

Als work around kan je het volgende proberen. Roep het commando niet meteen aan, maar zet die eerst in een ander scriptje en roep daarna dat script aan.

Maw iets van (ongetest!)
code:
1
2
3
4
5
echo #!/bin/sh > tmpscript
for i in ... 
  etc etc
  echo /usr/sbin/smbldap-useradd -c \"${naam}\" (etc etc) >> tmpscript 
done

In tmpscript zullen dan alle commando's staan met 'keiharde' aanhalingstekens en namen met spaties ertussen. Als je daarna tmpscript uitvoert zou het dus moeten werken.

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 08:30
Wat ik zeg klinkt inderdaad vreemd, maar het gebeurt toch. Ik heb het geregeld zoals jij in je eerste post aangaf en als ik er 'echo' voor zet verschijnt het juiste commando op het scherm (met de naam dus tussen aanhalingstekens). Maar als ik die dan uit laat voeren (dus zonder 'echo' in het script ervoor) krijg ik nog steeds alleen twee aanhalingstekens en de voornaam als gecos. Voer ik echter de opdracht zoals die mét echo op het scherm verschijnt handmatig in (zonder variabelen dus, maar exact zoals het er staat), dán gaat het wel goed. Ik straks het bovenstaande proberen.

^ Wat hij zegt.


  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 08:30
Je tweede manier werkt perfect! Door het juiste commando naar een tijdelijk bestand weg te schrijven en dat bestand aan het eind van het script uitvoerbaar te maken en uit te voeren gaat het hélemaal goed. Bedankt!

^ Wat hij zegt.

Pagina: 1