Ciao come si evince dal seguente script (LINK), quando richiamo la funzione "ReadFileLines", passandole degli argomenti, perdo per strada la variabile "$i".
Chiedo quindi, se avete idea di come poter mantenere tale variabile?
inb4 rtfm : ho già dato una rapida controllata all'Adv.Bash.Guide e un po a google. Ho fatto inoltre alcuni tentativi, racchiudendo la variabile in apici e virgolette, ma niente. Forse dovrei tradurre la variabile, in qualche modo, all'interno delle brackets (parentesi) della funzione, ma non ho idea di come procedere
Certo che la perdi, quando la variabile viene letta dalla shell viene espansa. Nel momento in cui chiami la funzione $i viene trasformata in un valore (che in questo caso è vuoto). Non so se c'è un workaround per questa cosa, che fra l'altro mi pare parecchio inelegante. Forse potresti provare con il riferimento indiretto: http://tldp.org/LDP/abs/html/ivr.html#IVRREF
Oppure non puoi passare il comando solamente e mettere la variabile direttamente dal ciclo?
$2 $i
Ti risparmio anche dei problemi futuri: ci sono dei potenziali problemi in questo script, il primo che mi viene in mente è che il ciclo for spezza i contenuti del file in base al separatore interno di default dei campi ($IFS) e quindi se non lo aggiusti non avrai in i le variabili che vuoi.
Mi spiego: bash in questo tipi di cicli decide quale carattere usare come separatore di campo in base a una variabile interna che di default è settata allo spazio bianco, non al newline.
per spiegarmi con un esempio, se nel file hai file numero 1.txt file numero 2.txt
tu ti aspetti di trovare in i: file numero 1.txt; file numero 2.txt invece troverai file; numero; 1.txt; file; numero; 2.txt perchè bash spezza sul carattere vuoto, non sul newline. Per ovviare a questo problema devi cambiare il valore di IFS per soddisfare i tuoi bisogni. Vedi: http://tldp.org/LDP/abs/html/internalvariables.html#IFSREF
PS: Vista l'esiguità del codice, non facevi prima a postarlo invece di farci scaricare un file zippato?
#!/bin/bash
# Dummy list ls -1 / > lista.txt
# Funzione Read-Line ReadFileLines() { for i in $(cat $1) do $2 done }
L'esempio è semplificato, rispetto a quello che avrei intenzione di fare, e dovendo richiamare più volte la variabile $i, purtroppo non posso inserirla direttamente dentro alla funzione come consigliato.
vabbè dai, al limite risolvo creando la funzione con il ciclo for contenente lo script in se, e non tramite variabile, anche se mi fa perdere un po di flessibilità