2012-06-15 34 views
5

Quiero obtener el segundo último elemento dado a un programa de shell. Actualmente lo hago así:¿Cómo obtener el segundo último argumento del script de 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 

Estoy seguro de que hay una manera mucho más fácil de hacer esto. Entonces, ¿cómo puedo obtener el segundo último argumento de una entrada de script de shell en la menor cantidad de líneas posible?

Respuesta

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

Tenga en cuenta las citas, lo que garantiza que los argumentos con espacios en blanco se mantengan unidos, lo que su solución original no hace.

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

En bash/ksh/zsh puede simplemente $ {@: -2: 1}

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

el shell de Bourne se puede utilizar eval:

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

El primero no lo hace trabajar en zsh, pero '$ {@ [- 2]}' sí. –

+0

La cita en esta respuesta es correcta para zsh, pero incorrecta en cualquier shell que cumpla POSIX (como bash o ksh). –

+0

Esto se puede hacer en Bourne sin eval, por ejemplo, cambiando args dentro de una función: 'penultimate() {while [" $ # "-gt 2]; hacer cambio; hecho; printf '% s \ n' "$ 1"; }; penultimate "$ @" ' –

Cuestiones relacionadas