2012-06-15 16 views
5

Voglio ottenere il secondo ultimo elemento assegnato a un programma di shell. Attualmente lo faccio in questo modo:Come ottenere il penultimo argomento dallo script di shell?

file1_tmp="${@: -2}" 
oldIFS=$IFS 
IFS=" " 
count=0 
for value in $file1; do 
    if [[ count -e 0 ]]; then 
    file1=$value 
    fi 
    count=1 
done 
oldIFS=$IFS 

Sono sicuro che c'è un modo molto più semplice per farlo. Quindi, come posso ottenere il penultimo argomento da uno script di shell inserito nel minor numero possibile di righe?

risposta

13
set -- "first argument" "second argument" \ 
     "third argument" "fourth argument" \ 
     "fifth argument" 
second_to_last="${@:(-2):1}" 
echo "$second_to_last" 

Si noti la citazione, che garantisce che gli argomenti con spazio bianco si uniscano tra loro, cosa che la soluzione originale non fa.

1
n=$(($#-1)) 
second_to_last=${!n} 
echo "$second_to_last" 
4

In bash/ksh/zsh si può semplicemente $ {@: -2: 1}

$ set a b c d 
$ echo ${@: -1:1} 
c 

In Bourne shell è possibile utilizzare eval:

$ set a b c d 
$ echo $(eval "echo \$$(($#-2))") 
c 
+0

Il primo non lo fa funziona in zsh, ma '$ {@ [- 2]} fa. –

+0

La citazione in questa risposta è corretta per zsh, ma non corretta in qualsiasi shell compatibile con POSIX (come bash o ksh). –

+0

Questo può essere fatto in Bourne senza eval - per esempio, spostando gli arg all'interno di una funzione: 'penultimate() {while [" $ # "-gt 2]; fare turno; fatto; printf '% s \ n' "$ 1"; }; penultimate "$ @" ' –

Problemi correlati