2012-04-03 24 views
72

Co oznacza znak dolara, po którym następuje znak at (@) w skrypcie powłoki?

Na przykład:

umbrella_corp_options [email protected] 
+4

możliwe duplikat [co jest $ @ lub wyszukiwanie na wyjaśnieniu $ @ w bash] (http://stackoverflow.com/questions/3898665/what-is-or-search-for-explanation-of-in-bash) – l0b0

Odpowiedz

106

[email protected] jest wszystko z parametrów przekazanych do skryptu.

Na przykład, jeśli zadzwonisz ./someScript.sh foo bar następnie [email protected] będzie równa foo bar.

Jeśli zrobić:

./someScript.sh foo bar 

a następnie wewnątrz someScript.sh odniesienia:

umbrella_corp_options "[email protected]" 

ten zostanie przekazany do umbrella_corp_options z każdego parametru ujęty w cudzysłów, co pozwala podjąć parametrów z pustą przestrzenią od dzwoniącego i przekazać je dalej.

+0

STATUS_ACCESS_DEN ... fantazyjne edytowanie dzięki! – Har

+0

Co by $ @ zawierał, gdybym zrobił "someScript.sh foo bar" boo daleko "? – trusktr

+0

http://teaching.idallen.com/dat2330/04f/notes/shell_variables.txt Sprawdź to. – Har

5

From the manual:

@

rozszerza do pozycyjnych, począwszy od pierwszego. Gdy rozszerzenie występuje w podwójnych cudzysłowach, każdy parametr rozwija się do oddzielnego słowa. Oznacza to, że "$ @" jest równoważne "$ 1" "$ 2" ... Jeśli podwójne rozszerzenie występuje w obrębie słowa, rozwinięcie pierwszego parametru jest połączone z początkową częścią oryginalnego słowa, a rozwinięcie ostatniego parametru jest połączone z ostatnią częścią oryginalnego słowa. Gdy nie ma żadnych parametrów pozycyjnych, "$ @" i @ @ rozszerzają się do zera (tj. Są usuwane).

8

Korzystanie z czystym [email protected] środków w większości przypadków „boli programatora tak mocno, jak to możliwe”, ponieważ w większości przypadków prowadzi to do problemów z rozdzielania tekstu i ze spacjami i innych znaków w argumentach.

W (odgadywanym) 99% wszystkich przypadków wymagane jest zamknięcie go w ": "[email protected]", co pozwala na niezawodne powtarzanie argumentów.

for a in "[email protected]"; do something_with "$a"; done 
+4

Twoja linia można zapisać jako: dla a; zrób coś_z "$ a"; zrobione ;-) – Alfe

+1

@Alfe Wiem, po prostu o tym zapomniałem. Pomyśl o tym jako 'dla a in start_token" $ @ "end_token; zrób coś_z "$ a"; done' :-) – glglgl

54

[email protected] jest prawie taka sama jak $*, zarówno co oznacza „wszystkie argumenty wiersza poleceń”. Są one często używane do przekazywania wszystkich argumentów do innego programu (tworząc w ten sposób otoki wokół tego innego programu).

Różnica między tymi dwiema składniami pojawia się, gdy masz argument zawierający spacje (np.) I umieścić [email protected] w cudzysłowach:

wrappedProgram "[email protected]" 
# ^^^ this is correct and will hand over all arguments in the way 
#  we received them, i. e. as several arguments, each of them 
#  containing all the spaces and other uglinesses they have. 
wrappedProgram "$*" 
# ^^^ this will hand over exactly one argument, containing all 
#  original arguments, separated by single spaces. 
wrappedProgram $* 
# ^^^ this will join all arguments by single spaces as well and 
#  will then split the string as the shell does on the command 
#  line, thus it will split an argument containing spaces into 
#  several arguments. 

Przykład: Wywoływanie

wrapper "one two three" four five "six seven" 

spowoduje:

"[email protected]": wrappedProgram "one two three" four five "six seven" 
"$*": wrappedProgram "one two three four five six seven" 
$*: wrappedProgram one two three four five six seven 
+1

Są * nie * takie same, a strona podręcznika jest wyraźnie widoczna na temat skutków ubocznych $ * za pomocą IFS-co niekoniecznie jest przestrzenią. (Gdyby były takie same, nie byłoby sensu, poza zapewnieniem zgodności, oferowania obu.) –

+5

Nie, nie są. Powiedziałem tak dwa wiersze poniżej: "Różnica między tymi dwoma ..." Aby uzyskać krótkie zdania i zwiększyć czytelność, czytelnik musi przeczytać więcej niż jedno zdanie przed wydaniem werdyktu: -/ – Alfe

+1

Alfe, Christoffer wstawia to jedno słowo "prawie" zrobiło piekielną różnicę, nie poświęcając żadnej lapidarności ani czytelności. W rzeczywistości przegłosowałem tę odpowiedź (w przeciwieństwie do przyjętej) dokładnie dzięki temu subtelnemu podkreśleniu * różnicy * ... - zanim zdałem sobie sprawę, że było to prawie wbrew twojej woli! ;) –

13

Są to argumenty wiersza poleceń, gdzie:

[email protected] = przechowuje wszystkie argumenty na liście ciągów
$* = przechowuje wszystkie argumenty jako jeden ciąg znaków
$# = przechowuje liczbę argumentów

+1

Masz '$ @' i '$ *' do tyłu – iruvar

Powiązane problemy