/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Tcl - sætte en variabel variabel
Fra : JoeX


Dato : 04-02-08 16:50

Hvis jeg har denne pseudo Tcl kode. Den skal gå igennem hver server (srv1 og
srv2) og køre forskellige checks for dem (ping og stuff på srv1 og kun ping
på srv2):

set srv1 "ping stuff"
set default "ping"

foreach srv "srv1 srv2" {

# the troublesome lines
if { ${srv} is defined } {
set check ${srv}
} else {
set checks $default }

foreach check $checks {
puts "$srv $check"
if { $srv_check == "ping" } {
puts ping }
if { $srv_check_ == "stuff" } {
puts stuff }
}}

I Bash ville jeg gøre det med ${srv} men det fungere ikke i Tcl.



 
 
Jesper Staun Hansen (04-02-2008)
Kommentar
Fra : Jesper Staun Hansen


Dato : 04-02-08 17:39

JoeX wrote:
> Hvis jeg har denne pseudo Tcl kode. Den skal gå igennem hver server (srv1 og
> srv2) og køre forskellige checks for dem (ping og stuff på srv1 og kun ping
> på srv2):
>
> set srv1 "ping stuff"
> set default "ping"
>
> foreach srv "srv1 srv2" {
>
> # the troublesome lines
> if { ${srv} is defined } {
> set check ${srv}
> } else {
> set checks $default }
>
> foreach check $checks {
> puts "$srv $check"
> if { $srv_check == "ping" } {
> puts ping }
> if { $srv_check_ == "stuff" } {
> puts stuff }
> }}
>
> I Bash ville jeg gøre det med ${srv} men det fungere ikke i Tcl.
>
>


Der er nogle af tingene jeg har lidt svært ved at se hvor du vil hen
med, så her er et forslag (testet med tclsh8.4):

################################################
#set srv1 "ping stuff"
set default "ping"

array set srv [list {srv1} {ping stuff} {srv2} {default} ]

## Metoder til array management
#metode 1
foreach somevariable [array names srv] {
puts "Data on \"$somevariable\": $srv($somevariable)"
}
#metode 2
foreach {name value} [array get srv] {
puts "Data on \"$name\": $value"
}

proc addname {db first last} {
upvar $db name

incr name(ID)
set id $name(ID)

set name($id,first) $first ;#
set name($id,last) $last ;#
;#
}

# siden du bruger check senere og sætter ind i array (se ovenstående
funktion)
set check(ID) 0

foreach {name value} [array get srv] {
### Well, det nederste her er ikke rigtigt nødvendigt...
if {[array exist srv]} {
addname check $name $value
} else {
addname check $name $default
}

foreach {names values} [array get check] {
puts "$values"
#### Er lidt mystifiseret over hvad du laver her??
#### spørger siden du bruger en foreach orignal til arrays, men har kun
#### check som variabel ovenstående i dit eksempel.
if { $values == "ping" } {
puts "ping"
}
if { $values == "stuff" } {
puts "stuff"
}
}
}
##############################################
Og outputtet:
##############################################
Data on "srv1": ping stuff
Data on "srv2": default
Data on "srv1": ping stuff
Data on "srv2": default
ping stuff
srv1
1
ping stuff
srv1
2
default
srv2


JoeX (04-02-2008)
Kommentar
Fra : JoeX


Dato : 04-02-08 17:51

> Der er nogle af tingene jeg har lidt svært ved at se hvor du vil hen med,
> så her er et forslag (testet med tclsh8.4):
[CUT]

Mange tak for eksemplet men det ser alt for besværligt ud - det vil jeg ikke
kunne gennemskue igen om et halvt år.

Det er vigtigt for mig, at de variable variabler kan defineres på én linie
for sig - altså noget a'ala:

set srv1 "ping stuff"
set srv2 "ping otherstuff"
eller
set check_srv1 "ping stuff"
set check_srv2 "ping otherstuff"

eller noget i den stil. Det gør det nemt at definere hvilke servere der skal
have hvilke checks. En nødløsning kunne være at lave en:

set ping "srv1 srv2"
set stuff "srv1"
set otherstuff "srv2"

Det gør det bare ikke så overskueligt.



Jesper Staun Hansen (04-02-2008)
Kommentar
Fra : Jesper Staun Hansen


Dato : 04-02-08 17:54

JoeX wrote:
>> Der er nogle af tingene jeg har lidt svært ved at se hvor du vil hen med,
>> så her er et forslag (testet med tclsh8.4):
> [CUT]
>
> Mange tak for eksemplet men det ser alt for besværligt ud - det vil jeg ikke
> kunne gennemskue igen om et halvt år.
>
> Det er vigtigt for mig, at de variable variabler kan defineres på én linie
> for sig - altså noget a'ala:
>
> set srv1 "ping stuff"
> set srv2 "ping otherstuff"
> eller
> set check_srv1 "ping stuff"
> set check_srv2 "ping otherstuff"
>
> eller noget i den stil. Det gør det nemt at definere hvilke servere der skal
> have hvilke checks. En nødløsning kunne være at lave en:
>
> set ping "srv1 srv2"
> set stuff "srv1"
> set otherstuff "srv2"
>
> Det gør det bare ikke så overskueligt.
>
>


Well, eksemplet er også lige hurtigt støbt sammen og har ikke haft tcl
programmering før, så det er nok lidt ineffektivt.
Men at du kører en foreach check $checks virker lidt mærkeligt, da din
check kun er en variabel og ikke en array.

JoeX (05-02-2008)
Kommentar
Fra : JoeX


Dato : 05-02-08 10:52

>> Det er vigtigt for mig, at de variable variabler kan defineres på én
>> linie for sig - altså noget a'ala:
>>
>> set srv1 "ping stuff"
>> set srv2 "ping otherstuff"
>> eller
>> set check_srv1 "ping stuff"
>> set check_srv2 "ping otherstuff"
>>
>> eller noget i den stil. Det gør det nemt at definere hvilke servere der
>> skal have hvilke checks. En nødløsning kunne være at lave en:
>>
>> set ping "srv1 srv2"
>> set stuff "srv1"
>> set otherstuff "srv2"
>>
>> Det gør det bare ikke så overskueligt.
>
> Well, eksemplet er også lige hurtigt støbt sammen og har ikke haft tcl
> programmering før, så det er nok lidt ineffektivt.
> Men at du kører en foreach check $checks virker lidt mærkeligt, da din
> check kun er en variabel og ikke en array.

Jeg har tidligere lavet det i Bash med følgende kode (klippet ud af
sammenhæng så måske virker det ikke):

#!/bin/bash

default_check="ping"
hosts="srv1 srv2"
srv1_check="ping backup"

for host in $hosts; do

host_check=${host}_check
if [ "${!host_check}" == "" ]; then
host_check="default_check"
fi

for check in ${!host_check}; do
if [ "$check" == "ping" ]; then
ping=1
fi
done

if [ $ping -eq 1 ]; then
echo "PING"
fi

done

Det er denne kode jeg gerne vil have porteret over til Tcl.



Ian (05-02-2008)
Kommentar
Fra : Ian


Dato : 05-02-08 16:13

"JoeX" <jx7810@REMOVE.gmail.com> writes:

> Jeg har tidligere lavet det i Bash med følgende kode (klippet ud af
> sammenhæng så måske virker det ikke):
>
> #!/bin/bash
>
> default_check="ping"
> hosts="srv1 srv2"
> srv1_check="ping backup"
>
> for host in $hosts; do
>
> host_check=${host}_check
> if [ "${!host_check}" == "" ]; then
> host_check="default_check"
> fi
>
> for check in ${!host_check}; do
> if [ "$check" == "ping" ]; then
> ping=1
> fi
> done
>
> if [ $ping -eq 1 ]; then
> echo "PING"
> fi
>
> done
>
> Det er denne kode jeg gerne vil have porteret over til Tcl.


Noget i denne stil?

set hosts {srv1 srv2}
set check(default) {ping}
set check(srv1) {ping backup}

foreach host $hosts {
if {[info exists check($host)]} {
set host_check $check($host)
} else {
set host_check $check(default)
}

foreach check $host_check {
switch $check {
ping {....}
....
}
}
}


mvh Ian

JoeX (05-02-2008)
Kommentar
Fra : JoeX


Dato : 05-02-08 16:35

> Noget i denne stil?
>
> set hosts {srv1 srv2}
> set check(default) {ping}
> set check(srv1) {ping backup}
>
> foreach host $hosts {
> if {[info exists check($host)]} {
> set host_check $check($host)
> } else {
> set host_check $check(default)
> }
>
> foreach check $host_check {
> switch $check {
> ping {....}
> ....
> }
> }
> }

Ja, den er rigtig fin - mange tak. Det fungere glimrende og er dejligt
overskuelig.



JoeX (05-02-2008)
Kommentar
Fra : JoeX


Dato : 05-02-08 14:20

Lidt mere simplificeret kunne jeg også spørge hvordan jeg får denne kode:

set srv myserv
set myserv_check "ping"
puts ${srv}_check

... til at vise indholdet af myserv_check variablen - altså "ping" istedet
for at vise "myserv_check"?



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste