Jak przekonwertować argumenty wiersza poleceń na tablicę skryptów bash?
Chcę to wziąć:
./something.sh arg1 arg2 arg3
i przekonwertuj go na
myArray=( arg1 arg2 arg3 )
tak, żebym mógł używać myArray do dalszego wykorzystania w skrypcie.
Ten poprzedni post SO jest bliski, ale nie omawia sposobu tworzenia tablicy: Jak analizować argumenty wiersza poleceń w Bash?
Muszę przekonwertować argumenty na zwykłą tablicę skryptów bash; Zdaję sobie sprawę, że mógłbym używać innych języków (na przykład Python), ale muszę to zrobić w bash. Chyba szukam funkcji „dołącz” lub czegoś podobnego?
AKTUALIZACJA: Chciałem również zapytać, jak sprawdzić, czy nie ma argumentów i przypisać domyślną wartość tablicy, a dzięki poniższej odpowiedzi udało mi się to działa:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
set
pozwala ustawić parametry pozycyjne dla zakresu. Pozwala także ustawić opcje powłoki. Możesz to zrobićset foo
, co będzie oznaczać$1
rozszerzenie do "foo", ale jeśli twoje parametry zaczynają się od myślnikaset
, założysz , że chcesz ustawić opcję powłoki. Podwójny myślnik zapewnia, że wszystkie poniższe parametry są interpretowane jako parametry pozycyjne do ustawienia.echo $@
wypisze wszystkie argumenty, aleecho $myArray
wypisze tylko pierwszy element. Aby zobaczyć je wszystkie, użyjecho ${myArray[@]}
."${myArray[@]}"
. Jeśli chcesz przeglądać tablicę w pętli, potrzebujesz cudzysłowów, aby uniknąć dzielenia jej poszczególnych elementów na IFSMoże to pomoże:
możesz również iterować po argumentach, pomijając „in”:
będą równoważne
źródło
arg
polu - czy jest to predefiniowana zmienna?${var}
jest rozszerzony do treścivar
.${var[n]}
jest rozszerzany do zawartości elementun
tablicyvar
. Czy${var[@]}
następnie rozszerza całą tablicę, tj.${var[0]} ${var[1]} ... ${var[n]}
(n
Będąc indeksem ostatniego elementu)?Właściwie lista parametrów może być dostępna za pomocą
$1 $2 ...
itp.Co jest dokładnie równoważne z:
Tak więc listę parametrów można zmienić za pomocą set
i
${!i}
jest to właściwy sposób uzyskania do nich dostępu:W twoim konkretnym przypadku można tego użyć (bez potrzeby stosowania tablic), aby ustawić listę argumentów, gdy żaden nie został podany:
co przekłada się na to jeszcze prostsze wyrażenie:
źródło
echo "$#" "$i+1" "${!i}";
aby uzyskać wynik dokładnie taki, jak pokazano?Oto inne użycie:
źródło
Jeszcze łatwiej, możesz działać bezpośrednio na
$@
;)Oto jak przekazać listę argumentów bezpośrednio z zachęty:
źródło
for stuff in "$@" ; do ...
to samo cofor stuff ; do ...
:)Widok obok siebie, w jaki sposób tablica i $ @ są praktycznie takie same.
Kod:
Wejście:
Wynik:
źródło
Warto podkreślić znaczenie podwójnych cudzysłowów. Załóżmy, że argument zawiera spacje.
Kod:
Wynik:
źródło