Shift: ¿Existe una versión global?

Shift: ¿Existe una versión global?

Para analizar la lista de argumentos, intenté implementar un esquema de análisis de arriba hacia abajo común.

Me preguntaba por qué mi eat()función no funcionaría. Porque los argumentos posicionales $1, $2, $3, ... están en el contexto de esa función en particular. No los del guión real. Gorrón. Todavía no me he acostumbrado a golpear.

Entonces mi pregunta es, si es correcto, que también el alcance del cambio es el contexto de mi eat()función, ¿no?

¿Realmente no hay forma de cambiar los argumentos del script desde dentro de otra función? : (

[¡Eso significa que tengo que implementar TODA la lógica (que normalmente se adhiere a analizadores de arriba hacia abajo) en una declaración de caso! (!?)]

Respuesta1

Una función puede devolver todos (o un subconjunto) de los argumentos que se le pasaron (por ejemplo, a través de una matriz global), y el script que realiza la llamada puede usarlos para establecer sus propios argumentos. p.ej

#!/bin/bash

declare -a args

nofoo() {
  # we don't like "--foo", it is forbidden!
  for a in "$@"; do
    [ "$a" != "--foo" ] && args+=("$a")
  done
}

nofoo "$@"
set -- "${args[@]}"

Desde help seten bash:

colocar:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

Establecer o desarmar valores de opciones de shell y parámetros posicionales.

Cambie el valor de los atributos del shell y los parámetros posicionales, o muestre los nombres y valores de las variables del shell.

[...]

-- Asigne los argumentos restantes a los parámetros posicionales. Si no quedan argumentos, los parámetros posicionales se desarman.

información relacionada