Bash script behandelt variabele als commando?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Borromini
  • Registratie: Januari 2003
  • Niet online

Borromini

Mislukt misantroop

Topicstarter
Ik heb een scriptje geschreven dat ZFS pools monitort, scrubt enzovoort. Om het onderhoudsvriendelijker te maken heb ik zoveel mogelijk variabelen gebruikt, zodat die in een apart configuratiebestand kunnen worden ingesteld, en het script zelf niet gewijzigd moet worden.

Het configuratiebestand ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Configuration file for the ZFS pool monitoring script

# Language defaults to English. Possible to have it in
# Dutch as well (nl). Help output is always English.
language={language:-en}

# Existing pools. This is an array; just add the names of every pool you have.
zfspools=(ichi ni)

# Mirror disks in eS-ATA enclosures. The disk's name in /dev/disk/by-id/.
# You need to set these manually for each pool.
${zfspools[0]}_mirror=ata-Maxtor_ZYERAR5794984
${zfspools[1]}_mirror=ata-Maxtor_ZYUEAR5868381

# E-mail address notifications go out to
email="azerty@qsdfqgqd.com"


De problematische variabelen zijn de mirror disks, die volgens Bash commando's zijn. Die variabelen zijn qua naamgeving gebaseerd op de zfspools array waarin alle bestaande ZFS pools vermeld worden. Dit om configuratie te vergemakkelijken wanneer er extra pools bijkomen. Bash pikt één waarde uit de array, daar wordt dan _mirror aangehangen, en je hebt je mirror disk voor die pool.

Het is mij niet duidelijk hoe die als commando worden opgepikt. Ik kan het dollarteken niet weglaten want dan vindt er geen expansie meer plaats.

Voor de duidelijkheid: ook toen de mirror disk variables nog in het script stonden nam Bash ze al voor commando's in plaats van variabelen.

Output door het script ziet er dan zo uit:
# zpoolmonitoring 
/etc/default/zpoolmonitoring: regel 12: ichi_mirror=ata-Maxtor_ZYERAR5794984: opdracht niet gevonden
/etc/default/zpoolmonitoring: regel 13: ni_mirror=ata-Maxtor_ZYUEAR5868381: opdracht niet gevonden


Wijzig ik in de configuratie ${zfspools[0]}_mirror naar ichi_mirror dan is er geen vuiltje aan de lucht...

Got Leenucks? | Debian Bookworm x86_64 / ARM | OpenWrt: Empower your router | Blogje


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 13:16

CAPSLOCK2000

zie teletekst pagina 888

Gebruik eval:
code:
1
eval "${zfspools[0]}_mirror=ata-Maxtor_ZYERAR5794984"

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • Borromini
  • Registratie: Januari 2003
  • Niet online

Borromini

Mislukt misantroop

Topicstarter
Bedankt! Dat werkt netjes.

Enig idee waarom Bash moeilijk doet over de declaratie zoals ik ze eerst had?

Got Leenucks? | Debian Bookworm x86_64 / ARM | OpenWrt: Empower your router | Blogje


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 13:16

CAPSLOCK2000

zie teletekst pagina 888

Poeh, ik heb moeite om dat goed onder woorden te brengen. Het heeft te maken met de volgorde waarin bash opdrachten verwerkt. Bash is maar een beetje brakke taal die nogal wat truuckjes uithaalt.
Je commando begint met een dollarteken en in bash gebruik je geen dollarteken bij het toekennen van waardes aan variabelen, dus is het blijkbaar geen toekenning, denkt bash.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 13:24
Waarom überhaupt variable variablenamen? Is er een taal waarin dat niet enigszins brak is? Bash heeft (sinds 4.0?) ook associative arrays (je kunt poolnamen naar disks mappen) of je neemt twee gewone arrays waarbij ${zfsmirrors[0]} de disk behorend bij ${zfspools[0]} bevat. Iets als
Bash:
1
2
3
declare -A zfspools
zfspools[ichi]=ata-Maxtor_ZYERAR5794984
zfspools[ni]=ata-Maxtor_ZYUEAR5868381
is ook overzichtelijker (zeker als je veel pools hebt) omdat je direct de disk achter de poolnaam hebt staan.

Acties:
  • 0 Henk 'm!

  • Borromini
  • Registratie: Januari 2003
  • Niet online

Borromini

Mislukt misantroop

Topicstarter
Bedankt voor de tip Raynman, ik heb uiteindelijk een associative array gebruikt.

Got Leenucks? | Debian Bookworm x86_64 / ARM | OpenWrt: Empower your router | Blogje

Pagina: 1