Come potrei leggere l'input dell'utente come array nella bash
shell?
./array_test.sh < war_and_peace.txt
.
Come potrei leggere l'input dell'utente come array nella bash
shell?
./array_test.sh < war_and_peace.txt
.
Risposte:
Ecco un modo per farlo:
while read line
do
my_array=("${my_array[@]}" $line)
done
echo ${my_array[@]}
Se lo esegui, continuerà a leggere dallo standard input fino a quando premi Ctrl + D (EOF). Successivamente, le linee inserite saranno presenti my_array
. Alcuni potrebbero trovare questo codice confuso. Fondamentalmente dice il corpo del ciclo my_array = my_array + element
.
Alcuni interessanti documenti:
La Guida avanzata agli script di Bash ha un grande capitolo sugli array
La pagina di manuale della lettura incorporato
15 esempi di array da thegeekstuff.com
read -r
è abbastanza utile / importante a volte ... Il link di Stefano alla "manpage builtin man" spiega il suo scopo ... (per impedire l'interpretazione della barra rovesciata).
E uno che non ricrea l'array ogni volta (anche se richiede bash 3.1 o versioni successive):
array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
[[ $line ]] || break # break if line is empty
array+=("$line")
done
printf '%s\n' "Items read:"
printf ' «%s»\n' "${array[@]}"
Vedi http://mywiki.wooledge.org/BashFAQ/001 per ulteriori informazioni.
E come sempre, per evitare di scrivere bug leggi http://mywiki.wooledge.org/BashGuide ed evita le guide tldp come la guida avanzata di scripting bash.
IFS
problema. Senza annullarlo, "leggi" tutti gli spazi iniziali e finali ... e ovviamente -r
anche ...
Che ne dici di questo one-liner;)
arr=( $(cat -) )
echo ${arr[@]}
Modificare:
In bash
,
arr=(val1 val2 ...)
è il modo di assegnare a un array . Usandolo insieme alla sostituzione dei comandi, è possibile leggere in array dalla pipeline che non è possibile utilizzare read
per ottenere ciò in modo semplice:
echo -e "a\nb" | read -a arr
echo ${arr[@]}
Scoprirai che non ha prodotto nulla a causa del fatto che read
non fa nulla quando stdin
è una pipa poiché una pipeline può essere eseguita in una subshell in modo che la variabile possa non essere affatto utilizzabile.
Utilizzando il modo suggerito da questa risposta:
arr=(`echo -e "a\nb"`)
echo ${arr[@]}
Dà a b
qual è il modo più semplice e più diretto di qualsiasi soluzione alternativa data dalle risposte dei valori di lettura in una variabile shell da una pipe e in bash letti dopo che una pipe non sta impostando valori .
cat war_and_peace.txt | ./array_test.sh
.