Posso farlo funzionare in ksh ma non in bash che mi sta facendo impazzire. Speriamo che sia ovvio che sto trascurando.problemi di bash che assegnano a un indice di array in un ciclo
Ho bisogno di eseguire un comando esterno in cui ogni riga dell'output verrà memorizzata in un indice di array.
Questo esempio semplificato ha l'aspetto di impostare correttamente l'array nel ciclo, tuttavia, una volta completato il ciclo, le assegnazioni di array sono sparite? È come se il ciclo fosse trattato completamente come un guscio esterno?
rusco.txt
this is a
test to see
if this works ok
testa.sh
#!/bin/bash
declare -i i=0
declare -a array
echo "Simple Test:"
array[0]="hello"
echo "array[0] = ${array[0]}"
echo -e "\nLoop through junk.txt:"
cat junk.txt | while read line
do
array[i]="$line"
echo "array[$i] = ${array[i]}"
let i++
done
echo -e "\nResults:"
echo " array[0] = ${array[0]}"
echo " Total in array = ${#array[*]}"
echo "The whole array:"
echo ${array[@]}
uscita
Simple Test:
array[0] = hello
Loop through junk.txt:
array[0] = this is a
array[1] = test to see
array[2] = if this works ok
Results:
array[0] = hello
Total in array = 1
The whole array:
hello
Così, mentre nel loop, assegniamo array [i] e l'eco verifica. Ma dopo il ciclo sono tornato all'array [0] contenente "ciao" senza altri elementi.
Stessi risultati su bash 3, 4 e piattaforme diverse.
"Devo eseguire un comando esterno in cui ogni riga dell'output verrà archiviata in un indice di array." Il "gatto" era un esempio semplificato. Ho bisogno di eseguire un comando e ottenere l'output nel ciclo e un reindirizzamento come
user1596414
Aggiornato con alcune opzioni. L'ultimo (se la tua versione di bash è abbastanza nuova) è probabilmente quella che vuoi. – chepner
+1 un file temporaneo o le opzioni di bash 4.2 (o successive) funzionano. Esiste una terza opzione che utilizza IFS per gestire gli spazi bianchi e può essere combinata con un semplice array assegnato se non è necessario ripetere l'iterazione attraverso l'output. – user1596414