Kiedy w skryptach powłoki używamy do {}
rozwijania zmiennych?
Na przykład widziałem:
var=10 # Declare variable
echo "${var}" # One use of the variable
echo "$var" # Another use of the variable
Czy jest znacząca różnica, czy to tylko styl? Czy jedno jest lepsze od drugiego?
bash
shell
syntax
curly-braces
Nowy użytkownik
źródło
źródło
{}
jest znany jako rozszerzenie nawiasów klamrowych .${}
jest znany jako rozszerzenie zmiennej. Robią różne rzeczy. Głosowałbym za tobą, z wyjątkiem bitu bez rozszerzenia.$()
służy do wykonania polecenia, któremd5sum=$(md5sum foo.bin)
zapisze dane wyjściowemd5sum foo.bin
w zmiennejmd5sum
, która jest teraz dostępna przy użyciu${md5sum}
. Ponadto +1 i wiele innych w duchu do OP za wspomnienie, że dobrą praktyką jest wyrażanie się otwarcie!$()
wykonuje swoje polecenie z podpowłoki .${1:-20}
jest formą rozszerzania parametrów. Nie jest to tutaj oczywiste, ponieważ wykorzystuje głównie cyfry i operatory arytmetyczne, które oszukują nas w myśleniu, że w grę wchodzi arytmetyka, ale w rzeczywistości odnosi się do parametru pozycyjnego$1
, który jeśli nie zostanie zdefiniowany, zostanie zastąpiony wartością domyślną20
(składnia jest${variable:-default_value}
).Zmienne są deklarowane i przypisywane bez
$
i bez{}
. Musisz użyćprzypisać. Aby odczytać ze zmiennej (innymi słowy „rozwinąć” zmienną), musisz użyć
$
.To mnie czasami myliło - w innych językach odwołujemy się do zmiennej w ten sam sposób, niezależnie od tego, czy znajduje się po lewej, czy po prawej stronie zadania. Ale skryptowanie powłoki jest inne,
$var=10
nie robi tego, co mogłoby się wydawać!źródło
Używasz
{}
do grupowania. Nawiasy klamrowe są wymagane do wyrejestrowania elementów tablicy. Przykład:źródło
dir=(*)
. O ile mi wiadomo,dir
to wbudowane polecenie do wyświetlania zawartości katalogu (równoważne zls -C -b
). Czy mógłbyś wyjaśnić?dir
jest nazwą zmiennej, a nawiasy są używane do gromadzenia rozszerzenia nazwy pliku*
w tablicy.Możesz także wykonywać pewne operacje na tekście wewnątrz nawiasów klamrowych:
Wynik:
lub
Wynik:
Masz rację, że „zwykłe zmienne” nie są potrzebne ... Ale to jest bardziej pomocne przy debugowaniu i czytaniu skryptu.
źródło
Koniec nazwy zmiennej jest zwykle oznaczony spacją lub znakiem nowej linii. Ale co jeśli nie chcemy spacji ani nowego wiersza po wydrukowaniu wartości zmiennej? Nawiasy klamrowe informują interpretera powłoki, gdzie znajduje się koniec nazwy zmiennej.
Klasyczny przykład 1) - zmienna powłoki bez końcowych białych znaków
Przykład 2) Ścieżka klasy Java z wersjonowanymi słojami
(Odpowiedź Freda już to stwierdza, ale jego przykład jest nieco zbyt abstrakcyjny)
źródło
Nawiasy klamrowe są zawsze potrzebne do uzyskiwania dostępu do elementów tablicy i przeprowadzania rozszerzenia nawiasów klamrowych.
Dobrze jest nie być zbyt ostrożnym i używać
{}
do rozszerzania zmiennych powłoki, nawet jeśli nie ma miejsca na dwuznaczności.Na przykład:
Lepiej więc zapisać trzy linie jako:
co jest zdecydowanie bardziej czytelne.
Ponieważ nazwa zmiennej nie może zaczynać się od cyfry, powłoka nie potrzebuje
{}
około numerowane zmienne (jak$1
,$2
itd.), Chyba że ekspansja następuje cyfry. To zbyt subtelne i sprawia, że jawnie używa się go{}
w takich kontekstach:Widzieć:
źródło
It's good to be not over-cautious
: Zastanawiam się, co myśli większość ludzi. Przez cały czas używaj nawiasów klamrowych, aby nie zapomnieć o nich, gdy są potrzebne, lub używaj ich tylko w razie potrzeby, aby poprawić czytelność.Po sugestiach SierraX i Petera na temat manipulacji tekstem nawiasy klamrowe
{}
służą do przekazywania zmiennej do polecenia, na przykład:Załóżmy, że masz plik sposi.txt zawierający pierwszy wiersz znanej włoskiej powieści:
Ouput:
quel ramo del lago di como che volge a mezzogiorno
Teraz utwórz dwie zmienne:
Teraz zastąp zmienną słowo słowem new_word w pliku sposi.txt
Ouput:
quel filone del lago di como che volge a mezzogiorno
Słowo „ramo” zostało zastąpione.
źródło
weel-known novel
bit. Mimo to głosowano.