Co oznacza znak dolara, po którym następuje znak at (@
) w skrypcie powłoki?
Na przykład:
umbrella_corp_options [email protected]
Co oznacza znak dolara, po którym następuje znak at (@
) w skrypcie powłoki?
Na przykład:
umbrella_corp_options [email protected]
[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.
@
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).
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
[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
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.) –
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
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! ;) –
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
Masz '$ @' i '$ *' do tyłu – iruvar
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