Discussione:
Script Bash : array e stringhe
(troppo vecchio per rispondere)
M_M
2012-12-25 23:57:51 UTC
Permalink
Se ho una variabile che contiene una stringa, ad es. "casa", posso inserire ad uno ad uno i
caratteri di quella stringa in un array e stamparli:

#!/bin/bash
declare -a Vett
I=0
Stringa=casa
Len=${#Stringa}
# Inserisce i caratteri della stringa nell'array "Vett"
while [ $I -lt $Len ]; do
Vett[$I]=${Stringa:$I:1}
echo Vett[$I]=${Vett[$I]} #stampa i campi dell'array Vett
let I=I+1
done
exit 0

ed infatti l'esempio mi restituisce:

Vett[0]=c
Vett[1]=a
Vett[2]=s
Vett[3]=a

ma se invece nello script avessi l'array come potrei ricavare la stringa?

Riesco con il comando echo a mettere in fila i caratteri dei campi dell'array che
compongono la stringa "casa" ma a creare una variabile contenente "casa" no. :-(
Marco
2012-12-26 00:17:37 UTC
Permalink
Post by M_M
Se ho una variabile che contiene una stringa, ad es. "casa", posso
inserire ad uno ad uno i caratteri di quella stringa in un array e
#!/bin/bash
declare -a Vett
I=0
Stringa=casa
Len=${#Stringa}
# Inserisce i caratteri della stringa nell'array "Vett"
while [ $I -lt $Len ]; do
Vett[$I]=${Stringa:$I:1}
echo Vett[$I]=${Vett[$I]} #stampa i campi dell'array Vett
let I=I+1
done
exit 0
Vett[0]=c
Vett[1]=a
Vett[2]=s
Vett[3]=a
ma se invece nello script avessi l'array come potrei ricavare la stringa?
Riesco con il comando echo a mettere in fila i caratteri dei campi
dell'array che compongono la stringa "casa" ma a creare una variabile
contenente "casa" no. :-(
temp=$IFS
echo "${array[@]}"
IFS=$temp

oppure ovviamente un ciclo

stringa=
for i in "${array[@]}"
do
stringa="${stringa}${i}"

done

echo "$stringa"
--
Cio' che si vede, e'.
Marco
2012-12-26 00:20:26 UTC
Permalink
Post by Marco
temp=$IFS
IFS=$temp
errore, deve essere

echo "${array[*]}"
--
Cio' che si vede, e'.
M_M
2012-12-26 12:26:03 UTC
Permalink
Post by Marco
Post by Marco
temp=$IFS
IFS=$temp
errore, deve essere
echo "${array[*]}"
Senza il tuo aiuto credo proprio che non sarei riuscito a risolvere. :-)
Ringraziandoti, colgo anche l'occasione per augurare a te e a tutto il gruppo buone feste ed un
felice anno nuovo!!!

A me cmq funziona indifferentemente sia con @ che con *

C'e` differenza invece se uso la tua prima soluzione con "temp=$IFS" e la seconda che utilizza
il ciclo for: nel primo caso il valore della variabile risultante e` "c a s a", nel secondo "casa".
RedWiz
2012-12-26 12:49:43 UTC
Permalink
Post by M_M
Post by Marco
Post by Marco
temp=$IFS
IFS=$temp
errore, deve essere
echo "${array[*]}"
Senza il tuo aiuto credo proprio che non sarei riuscito a risolvere. :-)
Ringraziandoti, colgo anche l'occasione per augurare a te e a tutto il
gruppo buone feste ed un felice anno nuovo!!!
C'e` differenza invece se uso la tua prima soluzione con "temp=$IFS" e
la seconda che utilizza il ciclo for: nel primo caso il valore della
variabile risultante e` "c a s a", nel secondo "casa".
marco si è dimenticato di mettere questa istruzione :
IFS=''

il blocco corretto è:

IFS=''
echo "${array[*]}"
unset IFS


fare unset di IFS lo ripristina al valore di default quindi non c'è
bisogno della variabile di appoggio $temp.
Marco
2012-12-26 12:55:31 UTC
Permalink
Post by RedWiz
Post by M_M
Post by Marco
Post by Marco
temp=$IFS
IFS=$temp
errore, deve essere
echo "${array[*]}"
Senza il tuo aiuto credo proprio che non sarei riuscito a risolvere. :-)
Ringraziandoti, colgo anche l'occasione per augurare a te e a tutto il
gruppo buone feste ed un felice anno nuovo!!!
C'e` differenza invece se uso la tua prima soluzione con "temp=$IFS" e
la seconda che utilizza il ciclo for: nel primo caso il valore della
variabile risultante e` "c a s a", nel secondo "casa".
IFS=''
IFS=''
echo "${array[*]}"
unset IFS
esatto, ero convinto di averlo scritto e invece l'avevo solo pensato.
--
Cio' che si vede, e'.
M_M
2012-12-26 13:19:24 UTC
Permalink
Post by RedWiz
Post by M_M
C'e` differenza invece se uso la tua prima soluzione con "temp=$IFS" e
la seconda che utilizza il ciclo for: nel primo caso il valore della
variabile risultante e` "c a s a", nel secondo "casa".
IFS=''
IFS=''
echo "${array[*]}"
unset IFS
fare unset di IFS lo ripristina al valore di default quindi non c'è
bisogno della variabile di appoggio $temp.
Perfetto grazie. Ho notato una differenza se uso * o la @
con * ottengo "casa"
con @ ottengo "c a s a"

Sai per caso un metodo semplice per ottenere l'inverso, cioe` "asac"?
Per ora l'unica soluzione che ho provato e` di creare un secondo array con i record invertiti, ovvero il
primo diventa l'ultimo e l'ultimo il primo, e poi creo la stringa da quello, ma forse c'e` una soluzione
piu` breve ed elegante ...
RedWiz
2012-12-26 13:33:44 UTC
Permalink
Post by M_M
Sai per caso un metodo semplice per ottenere l'inverso, cioe` "asac"?
man rev
M_M
2012-12-26 14:09:39 UTC
Permalink
Post by RedWiz
Post by M_M
Sai per caso un metodo semplice per ottenere l'inverso, cioe` "asac"?
man rev
Grazie, davvero semplice :-)

IFS=''
echo "${array[*]}" | rev
unset IFS

A dire il vero avevo anche cercato di ottenere una variabile con il contenuto di cio` che stampa echo
ma per ora con il metodo con il ciclo for come indicato da Marco, utilizzare rev mi risulta impossibile ...
provero` ancora. Ciao.
RedWiz
2012-12-26 13:33:44 UTC
Permalink
Post by M_M
Sai per caso un metodo semplice per ottenere l'inverso, cioe` "asac"?
man rev
M_M
2012-12-26 13:19:24 UTC
Permalink
Post by RedWiz
Post by M_M
C'e` differenza invece se uso la tua prima soluzione con "temp=$IFS" e
la seconda che utilizza il ciclo for: nel primo caso il valore della
variabile risultante e` "c a s a", nel secondo "casa".
IFS=''
IFS=''
echo "${array[*]}"
unset IFS
fare unset di IFS lo ripristina al valore di default quindi non c'è
bisogno della variabile di appoggio $temp.
Perfetto grazie. Ho notato una differenza se uso * o la @
con * ottengo "casa"
con @ ottengo "c a s a"

Sai per caso un metodo semplice per ottenere l'inverso, cioe` "asac"?
Per ora l'unica soluzione che ho provato e` di creare un secondo array con i record invertiti, ovvero il
primo diventa l'ultimo e l'ultimo il primo, e poi creo la stringa da quello, ma forse c'e` una soluzione
piu` breve ed elegante ...
mallin.shetland
2012-12-28 16:43:18 UTC
Permalink
Post by RedWiz
fare unset di IFS lo ripristina al valore di default quindi non c'è
bisogno della variabile di appoggio $temp.
Questo, ovviamente se IFS era al valore di default; io lascerei
la variabile di appoggio che dici?
RedWiz
2012-12-28 17:06:48 UTC
Permalink
Post by mallin.shetland
Post by RedWiz
fare unset di IFS lo ripristina al valore di default quindi non c'è
bisogno della variabile di appoggio $temp.
Questo, ovviamente se IFS era al valore di default;
ovviamente
Post by mallin.shetland
io lascerei la
variabile di appoggio che dici?
dico che sì, rispariare due cicli di cpu ed una manciata di byte ma
rischiare di incorrere possibili errori, oltre ad avere un codice meno
leggibile non è consigliabile.

vada per l'appoggio
mallin.shetland
2012-12-26 11:29:26 UTC
Permalink
Se ho una variabile che contiene una stringa ...
Stai esponendola tua soluzione e non il tuo problema. Cosa cerchi di
fare in realtà? A mio avviso stai cercando di replicare nella BASH la
gestione delle stringhe del C. Ciò è una stupidata. Anche perché nella
BASH il tipo di dati fondamentale è la stringa.
M_M
2012-12-26 11:47:22 UTC
Permalink
Post by mallin.shetland
Stai esponendola tua soluzione e non il tuo problema. Cosa cerchi di
fare in realtà?
Stavo solo studiando come si usano gli array negli script.
Ho fatto una prova con un vettore, ad es.
array0=( 1 2 3 )
e cercavo di ricavarne una stringa da attribuire ad una variabile cioe` var=123
mallin.shetland
2012-12-27 08:16:51 UTC
Permalink
Post by M_M
Stavo solo studiando come si usano gli array negli script.
Prima leggi la "Guida alla BASH per principianti" di Machtelt Garrels
M_M
2012-12-27 10:20:32 UTC
Permalink
Post by mallin.shetland
Prima leggi la "Guida alla BASH per principianti" di Machtelt Garrels
Si, grazie ce l'ho, l'avevo scaricata da qui:
http://www.codex.altervista.org/guidabash.html
E` un'ottima guida ma a mio avviso difetta un po' proprio sulle variabili matriciali dove l'autore si
dilunga per sole tre pagine facendo pochi esempi.
mallin.shetland
2012-12-27 20:17:42 UTC
Permalink
Post by M_M
E` un'ottima guida ma a mio avviso difetta un po' proprio sulle variabili
matriciali dove l'autore si dilunga per sole tre pagine facendo pochi
esempi.
Sono perplesso, molto perplesso, su parecchi punti.

Che cavolo è una variabile matriciale?
Esistono i vettori, esistono i vettori multidimensionali, alcuni
linguaggi come MATLAB hanno il tipo matrice ma le variabili
matriciali proprio non ci sono, specialmente nella BASH.

In effetti a volte si definisce il tipo matrice come un vettore
bidimensionale ma in genere si usa per calcoli algebrici, cosa
che io eviterei implementare con la BASH.

Poi che significa"solo tre pagine" il effetti ai vettori nella
guida è dedicato un solo capiltolo per una decina di pagine con
pochi esempi ma ciò non si discosta molto da come sono trattati
altri argomenti.

E non si discosta molto da come sono trattati i vettori su altri
libri quindici o venti pagine insieme ai puntatori nei libri sul C.

Infine,considerato che si tratta di una guida sulla BASH e non
di un libro sulla programmazione, non vedo di cosa ti lamenti.

Comunque se proprio ti serve vedere esempi di come si programma
veramente con la BASH:

http://mywiki.wooledge.org/
M_M
2012-12-28 09:43:52 UTC
Permalink
Che cavolo Ú una variabile matriciale?
Esistono i vettori, esistono i vettori multidimensionali, alcuni
linguaggi come MATLAB hanno il tipo matrice ma le variabili
matriciali proprio non ci sono, specialmente nella BASH.
Nel cap. 10.2 c'e` scritto:

10.2. Variabili matriciali
10.2.1. Creazione delle matrici
Una matrice [array] è una variabile che contiene molteplici valori. Ogni variabile può essere
utilizzata come matrice. Non esiste un limite massimo alle dimensioni di una matrice, e neppure un
qualche requisito che le variabili membri siano indicizzate o assegnate in modo contiguo. Le matrici
partono da zero: il primo elemento è indicizzato con il numero 0.
Poi che significa"solo tre pagine" il effetti ai vettori nella
guida Ú dedicato un solo capiltolo per una decina di pagine con
pochi esempi ma ciò non si discosta molto da come sono trattati
altri argomenti.
Mi correggo, le pagine dedicate agli array sono quattro (da pag. 146 a 149).

Io la guida l'avevo scaricata da qui:
http://www.codex.altervista.org/guidabash.html

La guida di Bash per i principianti
Machtelt Garrels
Versione 1.11 Edizione ultimo aggiornamento 20081227

Tu che versione hai?
mallin.shetland
2012-12-28 12:47:35 UTC
Permalink
|
|Array variables
| Creating arrays
| An array is a variable containing multiple values. Any variable may be
| used as an array. There is no maximum limit to the size of an array, nor
| any requirement that member variables be indexed or assigned contiguously.
| Arrays are zero-based: the first element is indexed with the number 0.

Ecco un altro cretino che legge traduzioni scritte col culo da altri cretini
più cretini di lui.
Post by M_M
La guida di Bash per i principianti
Machtelt Garrels
Versione 1.11 Edizione ultimo aggiornamento 20081227
Tu che versione hai?
Quella che non contiene errori di traduzione

http://tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
Post by M_M
Mi correggo, le pagine dedicate agli array sono quattro (da pag. 146 a 149).
Guarda che tutto* il capitolo tratta degli array (o vettori in italiano)
quindi se proprio vuoi metterti a fare il ragioniere conta bene.

Infine,considerato che si tratta di una guida sulla BASH e non
di un libro sulla programmazione, non vedo di cosa ti lamenti.


* In realtà il capitolo tratta argomenti supplementari (di cui gli array
sono il 90%). Ciò non meraviglia perché nella BASH gli array sono
qualcosa in più, una aggiunta, una miglioria, una cosa facoltativa.
Sono stati aggiunti per poter fare alcune cosette utili ma non sono
fondamentali come per altri linguaggi
M_M
2012-12-28 13:02:38 UTC
Permalink
Post by mallin.shetland
Ecco un altro cretino che legge traduzioni scritte col culo da altri cretini
più cretini di lui.
Sbagliato! Avresti dovuto scrivere:
Ecco un altro cretino che fidandosi di un cretino piu` cretino di lui, legge la guida che quel cretino
Post by mallin.shetland
Prima leggi la "Guida alla BASH per principianti" di Machtelt Garrels
ed il titolo che hai indicato e` in italiano, furbacchione!
Yoda
2012-12-28 17:05:12 UTC
Permalink
[........]

Scaricati l'ultimo in html da pluto, e' di Cooper e anche la traduzione
mi sembra ottima: <http://www.pluto.it/ildp/guide/abs.html> salvi la
tarballa, la scopatti e lo consulti, anche da console dando:
cd abs-guide; w3m -I iso-8859 index.html
(io ho l'utf-8 e li' son tutti file che se no si vedono male)

Cmq in informatica array si usa lasciare array, non matrice come in
algebra -- strano che md non ce l'abbia messo, ma forse e' scontato:
<ftp://ftp.linux.it/pub/People/md/glossario.tgz>
--
Tanti saluti
mallin.shetland
2012-12-28 18:00:28 UTC
Permalink
Post by Yoda
Scaricati l'ultimo in html da pluto, e' di Cooper e anche la traduzione
mi sembra ottima: <http://www.pluto.it/ildp/guide/abs.html> ...
La traduzione sarà ottima ma le cavolate scritte in inglese non
sono meglio delle cavolate scritte in italiano. Mi spiego meglio.

La "Advanced BASH Scripting Guide" è una guida avanzata per
cui è meglio che i principianti stiano alla larga e la leggano
quando non sono più principianti. O meglio ancora, non la leggano
mai.

Parliamo chiaro, la guida avanzata allo scripting è fatta bene
ma presenta delle tecniche avanzate che è bene conoscere ma è
bene usarle raramente, meglio mai. Sono tecniche che devono
essere usate da programmatori esperti quando non c'è altra via
essendo coscienti dei rischi a cui si va incontro. E "rischio" è un
eufemismo per dire che quelle tecniche portano direttamente
alla catastrofe.*

Per punizione ti apri questo link che pare fatto per demolire la
"Advanced BASH Scripting Guide":

http://mywiki.wooledge.org/


* Del resto un esperto è colui che evita miriadi di piccoli problemi
e viaggia diritto verso la catastrofe.
Post by Yoda
Cmq in informatica array si usa lasciare array, non matrice come in
algebra --
Io vedo quasi sempre array, raramente vettore.

È una questione di proprietà di linguaggio: se si rompe la leva
del cambio al meccanico dici che si è rotta la leva del cambio
o dici che si è trammiata la mazza in miezzo ai seggiulini?

M_M
2012-12-26 11:47:22 UTC
Permalink
Post by mallin.shetland
Stai esponendola tua soluzione e non il tuo problema. Cosa cerchi di
fare in realtà?
Stavo solo studiando come si usano gli array negli script.
Ho fatto una prova con un vettore, ad es.
array0=( 1 2 3 )
e cercavo di ricavarne una stringa da attribuire ad una variabile cioe` var=123
mallin.shetland
2012-12-26 11:29:26 UTC
Permalink
Se ho una variabile che contiene una stringa ...
Stai esponendola tua soluzione e non il tuo problema. Cosa cerchi di
fare in realtà? A mio avviso stai cercando di replicare nella BASH la
gestione delle stringhe del C. Ciò è una stupidata. Anche perché nella
BASH il tipo di dati fondamentale è la stringa.
Loading...