[Risolto]Rendere eseguibili i commandi scritti su stringhe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
breynm_07
Prode Principiante
Messaggi: 169
Iscrizione: venerdì 23 novembre 2012, 11:19
Desktop: mate
Distribuzione: Arch Linux 64
Sesso: Maschile
Località: Treviso-prov.

[Risolto]Rendere eseguibili i commandi scritti su stringhe

Messaggio da breynm_07 » sabato 23 novembre 2019, 16:46

Yos minnas, 'a rieccome :sisi: per rendere snello e leggero ed essenziale lo script in bash che stò scrivendo, avrei bisogno di salvare su stringa o array alcuni commandi, per farli poi eseguire a secondo le esigenze dello script, perchè le funzioni non mi sono d'aiuto, tanto vale che scriva per intero tutti i commandi, stò prima. :muro:
Ho fatto delle prove, inizialmente in un file txt ho scritto 2 comandi

Codice: Seleziona tutto

cmd.txt

"read -p 'Digita qualcosa ' t"
"echo $t"
poi ho fatto lo scriptino

Codice: Seleziona tutto

#!/bin/bash

readarray -t r < cmd.txt
`${r[0]}`
`${r[1]}`
ma non ha funzionato; ho provato tutte le combinazioni possibili di quote, doppie quote e backquote e formattazione del file, da txt a sh; e per ultimo questo

Codice: Seleziona tutto

#!/bin/bash

a=$(read -p 'Digita qualcosa ' t)
b=$(echo $t)
echo “$a”
echo “$b”
fallimento completo!! :cry:
Ultima modifica di breynm_07 il sabato 23 novembre 2019, 19:15, modificato 1 volta in totale.
Grande è l'impossibile, osare la confusione, il cielo sopra e sotto, ci si può solo perdere (CCCP)
C'era una volta una mela davanti alla finestra, un giorno una fredda folata di vento antartico violò la finestra e bacò la mela

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3842
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: Rendere eseguibili i commandi scritti su stringhe

Messaggio da UbuNuovo » sabato 23 novembre 2019, 17:52

Non si capisce bene cosa vuoi fare, dovresti spiegare meglio.
Se vuoi eseguire un comando assegnato ad una variabile di sicuro non devi usare echo ma devi solo scrivere il nome della variabile.
In alcuni casi, potrebbe essere necessario far precedere alla variabile il comando eval.

Codice: Seleziona tutto

8-) read comando
ls -al /scambio_dati/DATI/Immagini/campagna_toscana/orig
8-) $comando
totale 11920
drwxrwxrwx 1 giovanni root   4096 ott  7 18:19 .
drwxrwxrwx 1 giovanni root   4096 ott  7 18:13 ..
-rwxrwxrwx 1 giovanni root 534246 ott 16  2018 DSCF0001.JPG
-rwxrwxrwx 1 giovanni root 534198 gen  2  2010 DSCF0001.JPG_original
-rwxrwxrwx 1 giovanni root 558675 ott 16  2018 DSCF0003.JPG
-rwxrwxrwx 1 giovanni root 558631 gen  2  2010 DSCF0003.JPG_original
-rwxrwxrwx 1 giovanni root 567250 ott 16  2018 DSCF0004.JPG
-rwxrwxrwx 1 giovanni root 567206 gen  2  2010 DSCF0004.JPG_original
-rwxrwxrwx 1 giovanni root 522433 ott 16  2018 DSCF0010.JPG
-rwxrwxrwx 1 giovanni root 522391 gen  2  2010 DSCF0010.JPG_original
-rwxrwxrwx 1 giovanni root 523820 gen  2  2010 DSCF0012.JPG
-rwxrwxrwx 1 giovanni root 526768 gen  2  2010 DSCF0013.JPG
-rwxrwxrwx 1 giovanni root 538314 gen  2  2010 DSCF0015.JPG
-rwxrwxrwx 1 giovanni root 587388 gen  2  2010 DSCF0016.JPG
-rwxrwxrwx 1 giovanni root 613405 gen  2  2010 DSCF0017.JPG
-rwxrwxrwx 1 giovanni root 566512 gen  2  2010 DSCF0019.JPG
-rwxrwxrwx 1 giovanni root 545531 gen  2  2010 DSCF0020.JPG
-rwxrwxrwx 1 giovanni root 561173 gen  2  2010 DSCF0021.JPG
Se vuoi eseguire comandi scritti in un file di testo, il modo più semplice è l'uso source abbreviabile con il punto .
mettiamo che tu abbia il file comandi.txt contenente:

Codice: Seleziona tutto

echo 'prova uno'
ls "$HOME"
echo 'Per ora può bastare'
e che tu volessi eseguire quei comandi in uno script, basta scrivere:

Codice: Seleziona tutto

source comandi.txt
oppure

Codice: Seleziona tutto

. comandi.txt
nel punto dello script, in cui vuoi che venga eseguito quel codice.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
breynm_07
Prode Principiante
Messaggi: 169
Iscrizione: venerdì 23 novembre 2012, 11:19
Desktop: mate
Distribuzione: Arch Linux 64
Sesso: Maschile
Località: Treviso-prov.

Re: Rendere eseguibili i commandi scritti su stringhe

Messaggio da breynm_07 » sabato 23 novembre 2019, 19:14

Grazie Ubunovo, con "eval" riesco a far funzionare lo scriptino, visto che devo usare gli array

Codice: Seleziona tutto

cmd.txt

read -p 'Digita qualcosa ' t
echo "$t"

Codice: Seleziona tutto

#!/bin/bash

readarray -t r < cmd.txt
eval ${r[0]}
eval ${r[1]}

e questo è l'out

Digita qualcosa Rei
Rei
Nello script che stò scrivendo, devo usare un ciclo until, che non sempre serve, così con eval possono evitare di creare una serie di condizionalità, o di ripetere 2 volte un tot di righe; mi basterà far leggere la riga più adatta, semplicemente assegnando ad una variabile un valore da me inserito, che servirà per modificare il nome della stringa dopo il comando eval.
Grande è l'impossibile, osare la confusione, il cielo sopra e sotto, ci si può solo perdere (CCCP)
C'era una volta una mela davanti alla finestra, un giorno una fredda folata di vento antartico violò la finestra e bacò la mela

Avatar utente
breynm_07
Prode Principiante
Messaggi: 169
Iscrizione: venerdì 23 novembre 2012, 11:19
Desktop: mate
Distribuzione: Arch Linux 64
Sesso: Maschile
Località: Treviso-prov.

Re: [Risolto]Rendere eseguibili i commandi scritti su string

Messaggio da breynm_07 » domenica 29 dicembre 2019, 16:53

Devo riaprire il thread; perchè sono tornato al punto di partenza, a quanto pare "eval" non funziona se il comando contenuto in una stringa è un ciclo iterativo: until, while, for; lo stesso per "if"..Ecco l'output che ottengo

Codice: Seleziona tutto

00  file bash:
#!/bin/bash

a="if [ $c -eq 7 ]; then echo baka"
b="fi"
read -p 'inserire un numero tranne 7  ' c
eval $r
echo 'hai inserito ' $c
eval $b
e questo quello che succede

Codice: Seleziona tutto

 ~]$ ./00
inserire un numero tranne 7  7
./00: eval: riga 7: errore di sintassi: EOF non atteso
hai inserito 7
./00: eval: riga 8: errore di sintassi vicino al token non atteso "fi"
./00: eval: riga 8: `fi'
usando "for", ma vale anche per "until" o "while"

Codice: Seleziona tutto

#!/bin/bash

a="for c in {1..8}; do"
b=done
eval $a
echo $c
eval $b
ecco l'output

Codice: Seleziona tutto

 ~]$ ./00
./12: eval: riga 6: errore di sintassi: EOF non atteso

./12: eval: riga 7: errore di sintassi vicino al token non atteso "done"
./12: eval: riga 7: `done'
Qual'è la sintassi corretta per far eseguire quei comandi contenuti in una stringa? Ho già provato con le quote, parantesi e quant'altro, ma ho fallito
Grande è l'impossibile, osare la confusione, il cielo sopra e sotto, ci si può solo perdere (CCCP)
C'era una volta una mela davanti alla finestra, un giorno una fredda folata di vento antartico violò la finestra e bacò la mela

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3842
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: [Risolto]Rendere eseguibili i commandi scritti su string

Messaggio da UbuNuovo » domenica 29 dicembre 2019, 18:56

Non ho ancora capito l'utilità di questo genere di codice.
Con eval puoi far eseguire il codice inserito in una stringa, ma devi fare in modo che la sintassi, della stringa, sia rispettata.
Per esempio se il comando corretto è: for c in {1..8};do echo $c;done

Codice: Seleziona tutto

8-) cmd='for c in {1..8};do echo $c;done'
8-) eval "$cmd"
1
2
3
4
5
6
7
8
Puoi spezzare e rimontare la stringa che crea il codice, per esempio così:

Codice: Seleziona tutto

8-) a='for c in {1..8};'
8-) b=' do echo $c;'
8-) c='done'
8-) cmd="$a$b$c"
8-) eval "$cmd"
1
2
3
4
5
6
7
8
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
breynm_07
Prode Principiante
Messaggi: 169
Iscrizione: venerdì 23 novembre 2012, 11:19
Desktop: mate
Distribuzione: Arch Linux 64
Sesso: Maschile
Località: Treviso-prov.

Re: [Risolto]Rendere eseguibili i commandi scritti su string

Messaggio da breynm_07 » lunedì 30 dicembre 2019, 10:28

@Ubunovo: nel mio script ci sono 2 modalità: automatico e programmato, e ciò che distingue la modalità automatico dal programmato nel codice è la presenta di "until" nella prima, e l'assenza nell'altra. Al di là delle mie esigenze, vorrei sapere se c'è un modo di mettere i comandi composti come "until/while" "for" "if" e "quant'alto" su txt o stringa od array, in maniera separata ( cioè diverso dall'ultimo esempio che hai postato ), se con "eval" non è possibile, quale altro modo o comando lo permette?
Grande è l'impossibile, osare la confusione, il cielo sopra e sotto, ci si può solo perdere (CCCP)
C'era una volta una mela davanti alla finestra, un giorno una fredda folata di vento antartico violò la finestra e bacò la mela

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3842
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: [Risolto]Rendere eseguibili i commandi scritti su string

Messaggio da UbuNuovo » lunedì 30 dicembre 2019, 10:31

Penso che l'unico modo sia, come ti ho detto, ricostruire una stringa valida da far interpretare a eval; non credo che esistano altri modi.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
breynm_07
Prode Principiante
Messaggi: 169
Iscrizione: venerdì 23 novembre 2012, 11:19
Desktop: mate
Distribuzione: Arch Linux 64
Sesso: Maschile
Località: Treviso-prov.

Re: [Risolto]Rendere eseguibili i commandi scritti su string

Messaggio da breynm_07 » domenica 5 gennaio 2020, 2:36

Ho sistemato allo meglio, non è possibile spezzare la catena dei comandi "for/until/while-->done", "if-->fi, allora visto che era possibile, dato che non interrompevo nessuna delle catene prima citate, ho creato una funzione per la parte centrale, poi sul file txt che viene poi caricato in un'array, ho messo le 2 seguenti righe

Codice: Seleziona tutto

until [ condizione ]; do nome_funzione; done
nome_funzione
e questa è la riga che ho messo sul codice

Codice: Seleziona tutto

...................
eval "${nome_array[((23 + $psz))]}"
.....................
Non contento, ho di nuovo tentano di venirne a capo con le stringhe che hanno il nome dinamico, composto da lettere+$stringa, per esempio: a$b="valore qualsiasi", dove $b è a sua volta una stringa, a$b può assumere infiniti nomi, così da avere: a1, aMario, area, etc. perchè tramite i cicli iteratvi posso variare valore a $b. Nessun problema quando si attribuisce il valore alla stringa, lo stesso con gli array

Codice: Seleziona tutto

b=1
stringa$b=baka
readarray -t a$b < c$b
avremo che bash ha associato a "stringa1" il valore "baka", ed all'array "a1" il file "c1". Quando però si devono far interagire queste stringhe nomi+stringa con i comandi, sono incominciati i fraintendimentidi di referenziazione, perchè "$stringa$b" o "${a$b{[6]}", bash vede 2 stringhe: "$stringa$b" eguale a $stringa e $b, e con l'array ho errore di sintassi. L'uso di eval più l'escape di "\" o delle singole quote, ha risolto in parte il problema, finchè ci sono solo 2 simboli "$" per stringa, bash interpreta come voglio la variabile, dai 3 in sù, non sò come si fà e soprattutto se è possibile, ecco degli esempi

Codice: Seleziona tutto

if eval [ '$'{a$b[1]} -eq -1 -o $((${a1[1]} - $f)) -gt 0 ]; then...
in questo caso nel primo argomento, '$' non è equivalente con \$, perchè si ha errore, nel secondo argomento ho dovuto espandere la stringa $b, perchè avevo l'errore "troppi argomenti"

Codice: Seleziona tutto

if eval [[ '$'nome$b == nd ]]; then eval nome$b="$((20 + $E))"
è equivalente con

Codice: Seleziona tutto

if eval [[ \$nome$b == nd ]]; then eval nome$b="$((20 + $E))"
Nonostante esempi complessi trovati in rete, mi sono bloccato, e non ho capito qual'è la regola di base, per gestire tutte quelle "$" in una stringa, e in una riga.
Grande è l'impossibile, osare la confusione, il cielo sopra e sotto, ci si può solo perdere (CCCP)
C'era una volta una mela davanti alla finestra, un giorno una fredda folata di vento antartico violò la finestra e bacò la mela

Avatar utente
breynm_07
Prode Principiante
Messaggi: 169
Iscrizione: venerdì 23 novembre 2012, 11:19
Desktop: mate
Distribuzione: Arch Linux 64
Sesso: Maschile
Località: Treviso-prov.

Re: [Risolto]Rendere eseguibili i commandi scritti su string

Messaggio da breynm_07 » domenica 5 gennaio 2020, 14:34

Yattaaa!! Ho trovato la sintassi che fà interpretare come nome unico in caso di array con 3 "$" presenti

Codice: Seleziona tutto

eval "${a[$b1]}"                           #  prima
eval "${a[$(eval 'echo $b'$c)]}"           # dopo
Certo non è una sintassi semplice, magari in un script semplice è meglio definire la parte dentro le parentesi quadre con un'altra stringa

Codice: Seleziona tutto

for d in {1..10};do
eval f="\$b$d"
eval "${a[$f]}"
done
Sono arrivato alla soluzione dopo aver ragionato un bel pò, sopra questo codice, ed innumerevoli fallimenti

Codice: Seleziona tutto

#!/bin/bash
isdnMioProviderReteRemota=172.16.0.100
isdnTuoProviderReteRemota=10.0.0.10
isdnServizioOnline="MioProvider"
# ---------------------------------------------------------------------
      

reteRemota=$(eval "echo \$$(echo isdn${isdnServizioOnline}ReteRemota)")
reteRemota=$(eval "echo \$$(echo isdnMioProviderReteRemota)")
reteRemota=$(eval "echo \$isdnMioProviderReteRemota")
reteRemota=$(eval "echo $isdnMioProviderReteRemota")

echo "$reteRemota"   # 172.16.0.100
Comunque la sintassi che regola la base della referenziazione delle stringhe con nomi composti, ancora non mi è chiara, per niente.
Grande è l'impossibile, osare la confusione, il cielo sopra e sotto, ci si può solo perdere (CCCP)
C'era una volta una mela davanti alla finestra, un giorno una fredda folata di vento antartico violò la finestra e bacò la mela

Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti