Πώς μπορώ να εκτυπώσω το στοιχείο ενός πίνακα Bash σε ξεχωριστές γραμμές; Αυτό λειτουργεί, αλλά σίγουρα υπάρχει καλύτερος τρόπος:
$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three
Δοκίμασα αυτό, αλλά δεν λειτούργησε:
$ IFS=$'\n' echo ${my_array[*]}
one two three
Δοκιμάστε να κάνετε αυτό :
$ printf '%s\n' "${my_array[@]}"
Η διαφορά μεταξύ $@
και $*
:
Χωρίς εισαγωγικά, τα αποτελέσματα είναι απροσδιόριστα. Στο Bash, και τα δύο επεκτείνονται σε ξεχωριστά args και στη συνέχεια διαχωρίζονται σε wordsplit και globbed.
Quoted, το "$@"
επεκτείνει κάθε στοιχείο ως ξεχωριστό όρισμα, ενώ το "$*"
επεκτείνει τα args συγχωνευμένα σε ένα όρισμα: "$1c$2c..."
(όπου c
είναι
το πρώτο char του IFS
).
Σχεδόν πάντα θέλετε το "$@"
. Το ίδιο ισχύει και για το "${arr[@]}"
.
Πάντα να τα παραθέτετε!
Δοκίμασα τις απαντήσεις εδώ σε ένα γιγαντιαίο βρόχο for...if, αλλά δεν πήρα καμία χαρά - έτσι το έκανα έτσι, ίσως ακατάστατο, αλλά έκανε τη δουλειά:
# EXP_LIST2 is iterated
# imagine a for loop
EXP_LIST="List item"
EXP_LIST2="$EXP_LIST2 \n $EXP_LIST"
done
echo -e $EXP_LIST2
αν και αυτό πρόσθεσε ένα διάστημα στη λίστα, το οποίο είναι μια χαρά - ήθελα να είναι λίγο εσοχή. Επίσης, υποθέτω ότι το "\n" θα μπορούσε να εκτυπωθεί στην αρχική $EP_LIST.