W wielu pytaniach SO i samouczkach bash widzę, że mogę uzyskać dostęp do argumentów wiersza poleceń w skryptach bash na dwa sposoby:
$ ~ >cat testargs.sh
#!/bin/bash
echo "you passed me" $*
echo "you passed me" $@
Co skutkuje w:
$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2
Jaka jest różnica między $*
i $@
?
Kiedy należy użyć tego pierwszego, a kiedy drugiego?
bash
command-line-arguments
Oz123
źródło
źródło
echo "something $@"
jako błądOdpowiedzi:
Różnica pojawia się, gdy podane są parametry specjalne. Pozwól mi zilustrować różnice:
jeszcze jeden przykład na znaczenie cytowania: zwróć uwagę, że pomiędzy „arg” a liczbą są 2 spacje, ale jeśli nie podam słowa $:
a w bash
"$@"
jest „domyślną” listą do iteracji:źródło
$*
lub"$*"
może być wymagany, a cel nie może być obsługiwany przez$@
lub"$@"
?"$@"
z cudzysłowami.Niezła poręczna tabela przeglądowa z Wiki Bash Hackers :
gdzie
c
w trzecim rzędzie znajduje się pierwszy znak$IFS
, Separator pól wewnętrznych, zmienna powłoki.Jeśli argumenty mają być przechowywane w zmiennej skryptu, a argumenty mają zawierać spacje, z całego serca polecam zastosowanie
"$*"
lewy z wewnętrznym separatorem pól$IFS
ustawionym na tab .źródło
$IFS
oznacza „Internal Field Separator”.$ *
$ @
Źródło: Bash man
źródło
$ @ jest takie samo jak $ *, ale każdy parametr jest łańcuchem cytowanym, to znaczy parametry są przekazywane w stanie nienaruszonym, bez interpretacji lub interpretacji. Oznacza to między innymi, że każdy parametr na liście argumentów jest postrzegany jako osobne słowo.
Oczywiście należy podać „$ @”.
http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
źródło
Ten przykład pozwala wyróżnić różnice między „at” i „asterix” podczas ich używania. Zadeklarowałem dwie tablice „owoce” i „warzywa”
Zobacz następujący wynik powyższy kod:
źródło