Estoy un poco atascado. Mi tarea es imprimir los argumentos en mi script en orden inverso, excepto el tercero y el cuarto.
Lo que tengo es este código:
#!/bin/bash
i=$#
for arg in "$@"
do
case $i
in
3) ;;
4) ;;
*) eval echo "$i. Parameter: \$$i";;
esac
i=`expr $i - 1`
done
Como odio eval (saludos a PHP), estoy buscando una solución sin ella, pero no puedo encontrarla.
¿Cómo puedo definir la posición del argumento dinámicamente?
PD: No, no es una tarea, estoy aprendiendo shell para un examen, así que trato de resolver los exámenes anteriores.
fuente
arg
ya que están ordenados correctamente y no a la inversa. Para el uso deexpr
, estoy limitado a usar solo el estándar.#!/bin/bash
, puede usar${!i}
y(())
. Si desea seguir el estándar sh, estos no están disponibles, pero lo$((…))
están.eval
no es la única forma portátil como lo ha demostrado Ryan .Mantengo un script
reverse
en mi camino que hace esto:Ejemplo de uso:
También puede usar una función en lugar de un script dedicado.
fuente
$#
? ¿Puede ser algo más que un entero no negativo?local arg=$1
Este es un uso correcto y no peligroso de eval. Usted controla completamente el contenido que está
eval
ing.Si todavía te da malos sentimientos, entonces si no te importa la portabilidad, puedes usar la
${!i}
sintaxis de indirección de Bash .fuente
${!i}
¿no es parte de la sintaxis estándar?Suponiendo que los parámetros posicionales no contienen caracteres de nueva línea:
Prueba:
Prueba de salida:
fuente
Con
zsh
:Oa
es un indicador de expansión de parámetros para ordenar los elementos de la matriz tras la expansión en índices de matriz inversa .Para excluir 3 y 4:
fuente
Con básicamente cualquier caparazón:
Y no necesitas usar subshell. Por ejemplo:
...huellas dactilares...
Y aquí hay una función de shell que puede establecer un shell
alias
para usted que imprimirá los argumentos hacia adelante o hacia atrás:No intenta almacenar los valores literales para ningún argumento, sino que coloca una cadena como esta en
args
alias
:... y almacena solo referencias a los parámetros hacia atrás y hacia adelante. Almacenará hasta un recuento dado como argumento. Y así, lo anterior
alias
se generó como:printf
El comportamiento de 's se ve afectado en función del valor de retorno del comando anterior, que siempre es:
el comando nulo y, por lo tanto, generalmente es verdadero.printf
omitirá la mitad de sus argumentos cada vez que imprima, lo que, de forma predeterminada, imprimirá los argumentos de menor a mayor número. Sin embargo, si solo haces:... los imprime al revés.
Debido a que el alias no almacena ningún valor literal, su valor permanece estático mientras que los argumentos reales pueden cambiar, pero aún hará referencia a tantos como podría. Por ejemplo:
... que imprime ...
Pero restablecer el alias se puede hacer así:
... y así se imprime ...
fuente
fuente
for ((i = $# - 1; i >= 0; i--))