Jeśli w skrypcie powłoki zdefiniuję zmienną taką jak FOO=25
, czy istnieje różnica między odwoływaniem się do niej jako $FOO$
i ${FOO}$
?
command-line
scripts
Karnivaurus
źródło
źródło
$
w końcu! Będzie traktowany jako normalny znak, a nie jako część nazwy zmiennej.Odpowiedzi:
W większości przypadków oba
$var
i${var}
są takie same. (Pamiętaj, że nie wolno używać$
na końcu!)Jednym z przykładów, w których potrzebujesz nawiasów klamrowych, jest umieszczenie zmiennej w ciągłym łańcuchu.
Przykład:
wyjdzie
hello
.źródło
Aby odpowiedzieć na twoje główne pytanie,
${foo}
nazywa się to „rozszerzaniem parametrów” . Mówiąc ściślej ,$
sam rozpoczyna ekspansję parametrów,{ }
są one właściwie opcjonalne zgodnie ze specyfikacją POSIX , ale mogą być przydatne do wskazania końca nazwy zmiennej:Zasadniczo
$foo
i${foo}
są identyczne. Oprócz przypadków takich jak powyższe lub podczas manipulacji ciągami są one całkowicie równoważne.Jednak tak naprawdę nie powinieneś używać żadnego z nich. Ogólna zasada jest taka, że z nielicznymi wyjątkami należy zawsze używać
"$foo"
lub"${foo}"
nigdy,$foo
lub nigdy${foo}
. Zawsze powinieneś cytować swoje zmienne, aby uniknąć wywoływania operatora split + glob (więcej na ten temat później). Na pewno nie chcesz$foo$
. Finał nie$
ma znaczenia:Tak więc, chociaż zmienne nienotowane są czasem OK:
Zazwyczaj nie są i tak naprawdę należy ich unikać:
Zauważ, że nawiasy kwadratowe również tutaj nie pomagają:
Kiedy używasz
$foo
lub${foo}
, powłoka podzieli wartość zapisaną w zmiennej na białe znaki (można to zmienić, ustawiającIFS
zmienną na coś innego) na listę, a następnie każdy element listy jest traktowany jako wzorzec globalny i rozwijany do wszystkie pasujące pliki lub katalogi. Jest to znane jako operator split + glob . Aby to zilustrować, rozważ katalog z dwoma plikami:Teraz ustawmy zmienną na
foo *
:Co się stanie, jeśli spróbujemy sprawdzić, czy istnieje plik o tej nazwie?
Zmienna została podzielona na
foo
i*
, ponieważ ponieważ*
jest to symbol wieloznaczny pasujący do dowolnego ciągu, powłoka informuje, że plik o nazwiefoo *
exxists. Jeśli jednak podamy to poprawnie, nie stanie się tak:To był trywialny przykład ilustrujący tę kwestię. Wyobraź sobie, że
rm
zamiast tego użyłemecho
.Pierwsza zasada: zawsze podawaj swoje zmienne. Możesz użyć albo,
"$foo"
albo"${foo}"
zacytować to tak czy inaczej. Aby uzyskać więcej informacji na temat bezpiecznego używania zmiennych, spójrz na te posty:źródło
$ var="foo *"
być$ foo="foo *"
?var
Nigdzie nie używasz .