Como alterar o valor de um argumento em um script?

11

Eu tentei o seguinte pequeno script simples:

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

Mas quando executo ./script foo, recebo erro e o valor não é alterado:

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

Eu sei que $ 1 é o primeiro argumento que você passa para o seu script. Mas mesmo assim eu quero mudar seu valor.

user258266
fonte
relacionado: stackoverflow.com/questions/4827690/…
Ciro Santilli escreveu:

Respostas:

10

Você pode usar o builtin set:

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

Fonte e muito mais sobre: Altere um argumento da linha de comando - bash .

Radu Rădeanu
fonte
Eu tentei isso, mas ainda ecoava "foo". Você obteve resultados diferentes? Certifique-se de passar "foo" para o script.
Marty Fried
@MartyFried Ups, desculpe ... Acabei de atualizar minha resposta.
Radu Rădeanu 30/03
Isso funciona. :-) Boa resposta ... Eu acho que estava assumindo que ele não queria fazer isso, e não sei por que ele faria, mas sua resposta é realmente mais correta do que a minha sugestão para simplesmente não fazê-lo. Obrigado pelo link.
Marty Fried
4

Você não pode alterar essas variáveis ​​diretamente. Você poderia dizer:

x=$1
echo $x

Então você pode usar $xem vez

O uso $1=barsubstituirá imediatamente o primeiro parâmetro $1, e você está essencialmente declarando "foo=bar", e ele é interpretado como um comando "foo", não como uma variável "foo";

Marty Fried
fonte
Boa ideia, mas depende do que exatamente o OP deseja realizar ... +1 de mim.
Radu Rădeanu
2

Não use use $1for this, in bash, and other shells, $1é o primeiro argumento que você passa para o seu script:

#!/bin/bash
echo $1

Se você executar o procedimento acima foo.sh hello, ele será impresso, hellopois esse é o 1º argumento. Além disso, você se refere a uma variável como vare ao conteúdo de uma variável como $var. Portanto, para obter o comportamento esperado, use outro nome para sua variável e não use a $:

#!/bin/bash
var="bar"
echo $var
Terdon
fonte
Este pequeno script foi apenas um exemplo para fazer as pessoas entenderem o que eu quero. Eu sei que $ 1 é o primeiro argumento que você passa para o seu script. Mas, mesmo assim, quero mudar seu valor. Eu preciso aplicar isso em outro grande script. Obrigado.
user258266
@ user258266 não. Basta chamar o grande script com o novo valor, não use $1para os valores que deseja alterar. De qualquer forma, desde que você corrija o erro de sintaxe, ele deverá funcionar, o principal problema é que você estava usando o $.
terdon
Mas eu preciso ... não posso explicar aqui o porquê ... Talvez eu edite minha pergunta.
user258266
@ user258266, por favor. Você está tentando definir uma variável como $foo="bar", isso não funciona, você precisa foo="bar"sem o $.
terdon