Tengo la siguiente función:
bar() { echo $1:$2; }
Estoy llamando a esta función desde otra función foo
,. foo
en sí se llama de la siguiente manera:
foo "This is" a test
Quiero obtener el siguiente resultado:
This is:a
Es decir, los argumentos que bar
recibe deben ser los mismos tokens que paso foo
.
¿Cómo foo
debe implementarse para lograr esto? He intentado las siguientes dos implementaciones, pero ninguna funciona:
foo() { bar $*; }
- salida:
this:is
foo() { bar "$*"; }
- salida:
this is a test:
Mi pregunta es efectivamente cómo puedo preservar la cita de argumentos. ¿Es esto posible en absoluto?
Respuestas:
Uso
"$@"
:"$@"
y"$*"
tienen significados especiales:"$@"
se expande a varias palabras sin realizar expansiones para las palabras (como"$1" "$2" ...
)."$*"
une parámetros posicionales con el primer carácter en IFS (o espacio si IFS no está configurado o nada si IFS está vacío).fuente
$*
tenía esta semántica, ahora es lógico. Creo que esta respuesta en realidad resuelve otro problema que he tenido al iterar sobre matrices ...Debe usar
$@
, en lugar de$*
salida
Por que funciona
Porque con
$*
todos los parámetros se ven como una sola palabra , significa que pasaráThis is a test
abar
funcionar. En este caso, el paso del primer parámetro a la barra de funciones esThis
, el segundo esis
.Con
$@
cada parámetro es una cadena entre comillas , significa que pasará'This is'
'a'
'test'
a labar
función. Entonces, el primer parámetro pasado a la barra de funciones esThis is
, el segundo esa
.fuente