Πώς να επαναλαμβάνετε τα ορίσματα σε μια δέσμη ενεργειών Bash

Έχω μια σύνθετη εντολή που θα ήθελα να κάνω ένα shell/bash script. Μπορώ εύκολα να τη γράψω με όρους $1:

foo $1 args -o $1.ext

Θέλω να μπορώ να περάσω πολλαπλά ονόματα εισόδου στο σενάριο. Ποιος είναι ο σωστός τρόπος για να το κάνω;

Και, φυσικά, θέλω να χειρίζομαι ονόματα αρχείων με κενά μέσα σε αυτά.

Λύση

Χρησιμοποιήστε "$@" για να αναπαραστήσετε όλα τα ορίσματα:

for var in "$@"
do
    echo "$var"
done

Αυτό θα επαναλάβει κάθε όρισμα και θα το εκτυπώσει σε ξεχωριστή γραμμή. Το $@ συμπεριφέρεται όπως το $* με τη διαφορά ότι όταν παρατίθεται σε εισαγωγικά τα ορίσματα χωρίζονται σωστά αν υπάρχουν κενά σε αυτά:

sh test.sh 1 2 '3 4'
1
2
3 4
Σχόλια (7)

Επαναδιατύπωση μιας διαγραμμένης πλέον απάντησης από τον VonC.

Σχόλια (1)

Σημειώστε ότι η απάντηση του Robert'είναι σωστή και λειτουργεί και στην sh. Μπορείτε να το απλοποιήσετε (φορητά) ακόμη περισσότερο:

for i in "$@"

είναι ισοδύναμο με:

for i

Δηλαδή, δεν χρειάζεστε τίποτα!

Δοκιμή ($ είναι η γραμμή εντολών):

$ set a b "spaces here" d
$ for i; do echo "$i"; done
a
b
spaces here
d
$ for i in "$@"; do echo "$i"; done
a
b
spaces here
d

Πρώτη φορά διάβασα γι' αυτό στο Προγραμματιστικό Περιβάλλον του Unix των Kernighan και Pike.

Στο bash, η help for το τεκμηριώνει αυτό:

for NAME [in WORDS ... ;] do COMMANDS; done &gt, Εάν δεν υπάρχει το 'in WORDS ...;', τότε θεωρείται ότι υπάρχει το 'in "$@"'.

Σχόλια (10)