¿Cómo cambiar el valor de un argumento en un script?

11

Intenté el siguiente script pequeño y simple:

#!/bin/bash
$1="bar"
echo $1

Pero cuando ejecuto ./script foome sale un error y el valor no cambia:

/home/mika/script: line 2: foo=bar: command not found
foo

Sé que $ 1 es el primer argumento que pasa a su script. Pero incluso así quiero cambiar su valor.

usuario258266
fuente
relacionado: stackoverflow.com/questions/4827690/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

10

Puedes usar el incorporado set:

#!/bin/bash
set -- "bar"
echo $1

Fuente y más sobre: Cambiar un argumento de línea de comando - bash .

Radu Rădeanu
fuente
Intenté eso, pero todavía se hizo eco de "tonto". ¿Obtuviste resultados diferentes? Asegúrese de pasar "foo" al guión.
Marty Fried
@MartyFried Ups, lo siento ... Acabo de actualizar mi respuesta.
Radu Rădeanu
Eso funciona. :-) Buena respuesta ... Creo que estaba asumiendo que él no quería hacer eso, y no estoy seguro de por qué lo haría, pero su respuesta es en realidad más correcta que mi sugerencia de simplemente no hacerlo. Gracias por el enlace.
Marty Fried
4

No puede cambiar esas variables directamente. Tu puedes decir:

x=$1
echo $x

Entonces puedes usar $xen su lugar

El uso $1=barsustituirá de inmediato al primer parámetro $1, y esencialmente está declarando "foo=bar", y se interpreta como un comando "foo", no una variable "foo";

Marty Fried
fuente
Buena idea, pero depende de qué es exactamente lo que quiere que realice el OP ... +1 de mi parte.
Radu Rădeanu
2

No use el uso $1para este, en bashy otros shells, $1es el primer argumento que pasa a su script:

#!/bin/bash
echo $1

Si ejecuta lo anterior como foo.sh hello, se imprimirá helloya que ese es el primer argumento. Además, se refiere a una variable como vary al contenido de una variable como $var. Entonces, para obtener el comportamiento que espera, simplemente use otro nombre para su variable y no use un $:

#!/bin/bash
var="bar"
echo $var
terdon
fuente
Este pequeño script fue solo un ejemplo para que la gente entienda lo que quiero. Sé que $ 1 es el primer argumento que pasa a su script. Pero, incluso así, quiero cambiar su valor. Necesito aplicar esto en otro gran script. Gracias.
user258266
@ user258266 no. Simplemente llame al script grande con el nuevo valor, no lo use $1para los valores que desea cambiar. De todos modos, siempre y cuando corrija el error de sintaxis, debería funcionar, su principal problema era que estaba usando el $.
terdon
Pero necesito ... No puedo explicar por qué ... Tal vez edite mi pregunta.
user258266
@ user258266 por favor hazlo. Está intentando establecer una variable ya $foo="bar"que, eso no funciona, necesita foo="bar"sin el $.
terdon