2014-06-07 12 views

risposta

32

Nei pesci, i tuoi argomenti sono contenuti nella lista . Utilizza l'elenco delle sezioni per accedere a un intervallo di elementi, ad es. $argv[2..-1] restituisce tutti gli argomenti dal secondo all'ultimo.

Ad esempio

function loop --description "loop <count> <command>" 
    for i in (seq 1 $argv[1]) 
    eval $argv[2..-1] 
    end 
end 

Uso

$ loop 3 echo hello world 
hello world 
hello world 
hello world 
+2

@AliGajani l'ho fatto. È una domanda che non ho trovato la risposta su SO, quindi la aggiungo ora per aiutare gli altri. Infatti, [SO ti incoraggia a rispondere alle tue domande] (http://stackoverflow.com/help/self-answer). – Dennis

+0

welp the comment-ificition rimuove tutti gli spazi bianchi rendendoli illeggibili ... come si suppone ... qualunque cosa, [qui] (https://gist.github.com/OwenAR/45b034152442951f3c34#file-gistfile1-txt). quindi non si può semplicemente utilizzare 'set argv $ argv [2 ..- 1]' come una traduzione diretta da bash, voglio dire. quindi immagino che dovresti tradurre la logica in qualcosa di diverso in "pesce idiomatico"? a meno che non ci sia una funzione built-in che abbia lo stesso comportamento? –

+0

@Owen_R E 'ancora chiaro quello che stai chiedendo. Ti stai chiedendo come simulare il comportamento di 'shift' nel pesce? In tal caso, vedere [questa risposta] (http://stackoverflow.com/a/24101186/72321). Altrimenti questa discussione è fuori discussione e staresti meglio [chiedendo una nuova domanda] (http://stackoverflow.com/questions/ask). – Dennis

14

Il comportamento del comando shift possono essere simulati con set -e/--erase VARIABLE_NAME.

L'idea è quella di cancellare il primo argomento, quindi ottenere i restanti argomenti dalla lista .

Per esempio

function loop --description "loop <count> <command>" 
    set count $argv[1] 
    set --erase argv[1] 
    for i in (seq 1 $count) 
    eval $argv 
    end 
end 

Uso

$ loop 3 echo hello world 
hello world 
hello world 
hello world 
+3

Se qualcuno si sta chiedendo, io [ho risposto due volte, perché le risposte sono distinte] (http://meta.stackexchange.com/a/25210/253951). In questo modo la comunità può decidere quale risposta è migliore e può facilmente commentare le diverse risposte. – Dennis

7

Si potrebbe anche usare leggere che è più leggibile, a mio parere:

function loop 
    echo $argv | read -l count command 
    for i in (seq 1 $count) 
    eval $command 
    end 
end 

Questo funziona meglio soprattutto quando si desidera utilizzare più del primo argomento.

echo $argv | read -l first second rest 
Problemi correlati