Jak zmienić wartość argumentu w skrypcie?

11

Wypróbowałem następujący mały prosty skrypt:

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

Ale kiedy uruchamiam, pojawia ./script foosię błąd i wartość nie ulega zmianie:

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

Wiem, że 1 $ to pierwszy argument, który przekazujesz skryptowi. Ale nawet tak chcę zmienić jego wartość.

użytkownik258266
źródło
powiązane: stackoverflow.com/questions/4827690/…
Ciro Santilli 30 病毒 审查 六四 事件 法轮功

Odpowiedzi:

10

Możesz użyć wbudowanego set:

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

Źródło i więcej na temat: Zmień argument wiersza poleceń - bash .

Radu Rădeanu
źródło
Próbowałem tego, ale nadal odbijało się echem „foo”. Czy uzyskałeś różne wyniki? Pamiętaj, aby przekazać „foo” do skryptu.
Marty Fried
@MartyFried Ups, przepraszam ... Właśnie zaktualizowałem swoją odpowiedź.
Radu Rădeanu
To działa. :-) Dobra odpowiedź ... Myślę, że zakładałem, że nie chciał tego zrobić i nie jestem pewien, dlaczego to zrobił, ale twoja odpowiedź jest w rzeczywistości bardziej poprawna niż moja sugestia, by po prostu tego nie robić. Dzięki za link.
Marty Fried
4

Nie możesz bezpośrednio zmienić tych zmiennych. Można powiedzieć:

x=$1
echo $x

Następnie możesz użyć $xzamiast tego

Użycie $1=barnatychmiast zastąpi pierwszy parametr $1, a ty zasadniczo stwierdzasz "foo=bar", i jest on interpretowany jako polecenie „foo”, a nie zmienna „foo”;

Marty Fried
źródło
Fajny pomysł, ale zależy od tego, co dokładnie chce osiągnąć OP ... +1 ode mnie.
Radu Rădeanu
2

Nie używaj use $1dla tego, w bashi innych powłokach, $1jest pierwszym argumentem przekazywanym do skryptu:

#!/bin/bash
echo $1

Jeśli uruchomisz powyższe jako foo.sh hello, zostanie wydrukowane, helloponieważ jest to pierwszy argument. Odwołujesz się również do zmiennej jako vari do zawartości zmiennej jako $var. Aby uzyskać oczekiwane zachowanie, po prostu użyj innej nazwy dla swojej zmiennej i nie używaj $:

#!/bin/bash
var="bar"
echo $var
terdon
źródło
Ten mały skrypt był tylko przykładem, aby ludzie zrozumieli, czego chcę. Wiem, że 1 $ to pierwszy argument, który przekazujesz skryptowi. Ale nawet tak chcę zmienić jego wartość. Muszę zastosować to w innym dużym skrypcie. Dziękuję Ci.
user258266
@ user258266 nie. Po prostu wywołaj duży skrypt z nową wartością, nie używaj $1wartości, które chcesz zmienić. W każdym razie, dopóki naprawisz błąd składniowy, powinien on działać, twoim głównym problemem było to, że korzystałeś z $.
terdon
Ale potrzebuję ... Nie mogę wyjaśnić tutaj, dlaczego ... Może zmienię moje pytanie.
user258266
@ user258266 proszę zrobić. Próbujesz ustawić zmienną $foo="bar", ponieważ to nie działa, potrzebujesz foo="bar"bez $.
terdon