|
| 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"?
| |
|
|