Discussione:
Settare variabile d'ambiente bash da uno script awk
(troppo vecchio per rispondere)
paulatz
2007-12-17 15:07:55 UTC
Permalink
Ciao a tutti,
è da mezzora abbondante che mi sto perdendo nel manualone di awk, ma
non riesco a trovare la risposta (se c'è!): come faccio da uno script
awk a impostare una variabile d'ambiente bash; in modo che quando awk
termina la variabile resti settata?

Grazie in anticipo, LP.
io
2007-12-17 17:03:53 UTC
Permalink
Post by paulatz
Ciao a tutti,
è da mezzora abbondante che mi sto perdendo nel manualone di awk, ma
non riesco a trovare la risposta (se c'è!): come faccio da uno script
awk a impostare una variabile d'ambiente bash; in modo che quando awk
termina la variabile resti settata?
Uhm, direi che non si puo'. Leggi qui:

http://tldp.org/LDP/abs/html/othertypesv.html

"Child processes cannot export variables back to the parent processes that
spawned them."

L'unica possibilita' sarebbe che la shell che lanci dopo fosse figlia di
awk, e non so se da awk si riescono a lanciare programmi esterni.

Oppure puoi fare uno script che lancia awk, awk scrive le informazioni in un
file, e al termine di awk, sempre dall'interno dello script, leggi il file
per settare le variabili (occhio che anche in questo caso i valori sono
persi all'uscita dello script).
Clyde.bis
2007-12-17 17:07:10 UTC
Permalink
Post by paulatz
come faccio da uno script
awk a impostare una variabile d'ambiente bash; in modo che quando awk
termina la variabile resti settata?
Mi associo alla risposta che ti hanno già dato e in più ti propongo quella
banale (che sicuramente avrai già preso in considerazione e scartato): far
stampare ad awk il valore da assegnare, catturarlo e inserirlo in una
variabile:

variabile=$(comando | awk '[.....] {print $x}')

Certo è che la variabile non uscirà, se non con qualche escamotage, dal
contesto del chiamante.
--
no signature yet
paulatz
2007-12-18 16:16:49 UTC
Permalink
Post by Clyde.bis
Certo è che la variabile non uscirà, se non con qualche escamotage, dal
contesto del chiamante.
Sì, grazie per il chiarimento. Il metodo con $(), oppure con ``
ovviamento lo conoscevo già, però diventa scomodo (ed estremamente
inefficiente) se si vogliono impostare più variabili da una sola riga.
Vuol dire che farò tutto dentro awk, oppure in qualche altro modo.

Grazie, LP
Cybertoldo
2007-12-18 17:53:19 UTC
Permalink
Post by paulatz
Post by Clyde.bis
Certo è che la variabile non uscirà, se non con qualche escamotage, dal
contesto del chiamante.
Sì, grazie per il chiarimento. Il metodo con $(), oppure con ``
ovviamento lo conoscevo già, però diventa scomodo (ed estremamente
inefficiente) se si vogliono impostare più variabili da una sola riga.
...tu dici di voler realizzare un espediente tipo questo sotto?

# =======
# stringhe di input separate, per esempio, da TAB
TEST_INPUT="stringa 1"$'\t'"stringa 2"

VAR1=
VAR2=

eval $(echo "$TEST_INPUT" | awk '
BEGIN { FS="\t" }
{ print "export VAR1=\""$1"\"\n"
print "export VAR2=\""$2"\"\n"
}
')

echo "VAR1=$VAR1"
echo "VAR2=$VAR2"
# =======

ciao
--
Cybertoldo

Per rispondermi via email, sostituisci moc.liamg con gmail.com
Cybertoldo
2007-12-18 22:53:38 UTC
Permalink
Post by Cybertoldo
Post by paulatz
Post by Clyde.bis
Certo è che la variabile non uscirà, se non con qualche escamotage, dal
contesto del chiamante.
Sì, grazie per il chiarimento. Il metodo con $(), oppure con ``
ovviamento lo conoscevo già, però diventa scomodo (ed estremamente
inefficiente) se si vogliono impostare più variabili da una sola riga.
...tu dici di voler realizzare un espediente tipo questo sotto?
scusa, mi sono accorto che prima, per errore, ti ho postato uno script
sbagliato. Questo sotto e' anche un po' piu' sicuro ma pur sempre limitato:

#====
# Stringhe di input separate da TAB
# Non devono contenere apici (')
TEST_INPUT="stringa 1"$'\t'"stringa 2"
VAR1=
VAR2=

eval $(echo "$TEST_INPUT" | awk '
BEGIN { FS="\t" }
{ printf "VAR1=%c%s%c;\n", 0x27, $1, 0x27
printf "VAR2=%c%s%c;\n", 0x27, $2, 0x27
}
')

echo "VAR1=$VAR1"
echo "VAR2=$VAR2"

#====

ps. in ogni caso, dipende da cosa vuoi fare e dal formato dei dati di uscita
di awk: un espediente tipo quello sopra ha dei limiti sulla formattazione -
potrebbero essere accettabili, oppure no.

ciao
--
Cybertoldo

Per rispondermi via email, sostituisci moc.liamg con gmail.com
paulatz
2007-12-19 16:35:46 UTC
Permalink
Post by Cybertoldo
ps. in ogni caso, dipende da cosa vuoi fare e dal formato dei dati di uscita
di awk: un espediente tipo quello sopra ha dei limiti sulla formattazione -
potrebbero essere accettabili, oppure no.
Spledido, i miei output sono tutti numeri a virgola fissa, con un paio
di adattamenti sono riuscito a usare il tuo hack.

Grazie mille, LP.

Loading...