Newsgroup: it.comp.os.linux.iniziare
Titolo: Script Bash : array e stringhe

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. :-(
 
 


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'.
 

 IFS=$temp
 
errore, deve essere
 
echo "${array[*]}"


 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.
 
 

 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
 
 

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


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.
 

 unset IFS
 
esatto, ero convinto di averlo scritto e invece l'avevo solo pensato.


 ha scritto:

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 ...
 
 

 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.
 
 

 Stavo solo studiando come si usano gli array negli script.
 
Prima leggi la "Guida alla BASH per principianti" di Machtelt  Garrels
 
 
 
 

 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.
 
 

 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/
 

 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?
 
 

 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
 
 
 

 Prima leggi la "Guida alla BASH per principianti" di Machtelt  Garrels
 
ed il titolo che hai indicato e` in italiano, furbacchione!
 
 
 

 bisogno della variabile di appoggio $temp.
 
Questo, ovviamente se IFS era al valore di default; io lascerei
la variabile di appoggio che dici?
 
 
 


 
-- 
Tanti saluti
 

 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

 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?