Jaka jest różnica między deklarowaniem a składem

22

Czy ktoś może wyjaśnić różnicę między deklarowaniem a składem za pomocą przykładów z prawdziwego życia.

Rahul Patil
źródło

Odpowiedzi:

27

W bash, typeseti declaresą dokładnie takie same. Jedyna różnica polega na tym, że typesetuważa się ją za przestarzałą.

typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.

Strona podręcznika wyświetla je nawet w tym samym oddechu:

declare [-aAfFgilrtux] [-p] [name[=value] ...]
typeset [-aAfFgilrtux] [-p] [name[=value] ...]
    Declare variables and/or give them attributes.

typesetjest przenośny dla niektórych innych powłok, na przykład ksh93. Jeśli dążysz do przenośności między powłokami, użyj typeset(i upewnij się, że sposób, w jaki go wywołujesz, jest przenośny). Jeśli nie zależy Ci na takiej przenośności, użyj declare.

Chris Down
źródło
czy możesz podać przykład, gdzie i dlaczego to użycie w skrypcie bash
Rahul Patil
1
... jak powiedziałem, są dokładnie takie same. Nie rozumiem, jak je odróżnić, jeśli tak jest.
Chris Down,
2
Dobry. Pamiętaj, że „przestarzałe” pojawia się tylko w help typeset, a nie w man typeset.
fedorqui
2
@ChrisDown, nie wiesz, dlaczego dokładnie typesetjest uważany za przestarzały?
Alexej Magura
3

Znam przypadek, w którym declareprzydatne jest uniknięcie zła eval: pośrednia zmienność :

$ var=foo
$ x=var
$ declare "$x=another_value"
$ echo $var
another_value
Gilles Quenot
źródło
To miły komentarz, ale jak to odpowiada na pytanie, które dotyczy typeseti declare?
jw013,
To już dobrze odpowiedział Chris Down, moja odpowiedź to tylko przypadek, w którym jest to przydatne
Gilles Quenot
Być może nie byłem jasny. Komentarze powinny być komentarzami, a odpowiedzi powinny być odpowiedziami. To jest komentarz, a nie odpowiedź.
jw013,
3
Mój fragment nie skasuje się w komentarzu
Gilles Quenot,
ale nadal możesz przypisywać zmienne składem ... po prostu zastąp deklaruj składnią i nadal otrzymujesz ten sam wynik.
pcarvalho