Walczy przez chwilę, przekazując tablicę jako argument, ale i tak nie działa. Próbowałem jak poniżej:
#! /bin/bash
function copyFiles{
arr="$1"
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles $array
Odpowiedź z wyjaśnieniem byłaby miła.
Edycja: Zasadniczo w końcu wywołam funkcję z innego pliku skryptu. Plz wyjaśni, jeśli to możliwe, ograniczenia.
copyFiles {…}
icopyFiles(){…}
acopyFiles() {…}
, ale niecopyFiles{…}
. Zwróć uwagę na miejsce w wariancie bez()
Jeśli chcesz przekazać jeden lub więcej argumentów ORAZ tablicę, proponuję tę zmianę w skrypcie @AB
Tablica powinna być ostatnim argumentem i można przekazać tylko jedną tablicę
Wynik:
źródło
shift
korzystanie.shift 6
.arr
. Czy można mieć parametr tablicy pośrodku? A może nawet kilka parametrów tablic?function copyAndMove() { msg1=$1 ; arr1=...?... ; msg2=? ; arr2=...?... ; msg3=? ; ... }
. Jak ja bym zdefiniował je w Pythoniedef copyAndMove(msg1="foo", cpFiles=[], msg2="bar", mvFiles=[], msg3="baz"): ...
. Nieważne, znalazłem stackoverflow.com/a/4017175/472245Możesz także przekazać tablicę jako odniesienie. to znaczy:
ale zauważ, że wszelkie modyfikacje arr zostaną wprowadzone w tablicy.
źródło
Jest kilka problemów. Oto formularz roboczy:
Między deklaracją funkcji a musi być co najmniej spacja
{
Nie możesz używać
$array
, ponieważarray
tablica nie jest zmienną. Jeśli chcesz uzyskać wszystkie wartości z tablicy, użyj"${array[@]}"
W głównej deklaracji funkcji potrzebujesz,
arr="$@"
jak"${array[@]}"
będzie rozwinięte do wartości indeksowanych oddzielonych spacjami, jeśli użyjesz$1
, dostaniesz tylko pierwszą wartość. Aby uzyskać wszystkie wartości, użyjarr="$arr[@]}"
.źródło
arr=("$@")
break
poniżejecho "$i"
. W swojej wersji nadal zobaczysz wszystkie elementy. Jednak powinny to być trzy linie.Oto nieco większy przykład. Aby uzyskać wyjaśnienie, zobacz komentarze w kodzie.
źródło
Najlepszym sposobem jest podanie jako argumentów pozycji. Nic więcej. Możesz podać jako ciąg, ale w ten sposób może powodować pewne problemy. Przykład:
lub
wynik:
Masz na myśli, że jeśli wartość tablicy ma symbole spacji, musisz podać elementy przed przejściem, aby uzyskać dostęp do wartości przez indeks w funkcji, użyj parametrów pozycji 1 $ 2 $ 3 $ ... Gdzie indeks 0 -> 1, 1 -> 2, ... Aby iterować dostęp, najlepiej użyć zawsze 1 $ i po Shift. Nic więcej nie jest potrzebne. Możesz przekazać argumenty bez takiej tablicy:
bash media automatycznie buduje tablicę z przekazanych argumentów, które przekazały je do funkcji, a następnie masz argumenty pozycji. Ponadto, kiedy piszesz $ {array [2]}, naprawdę piszesz konsekwentny argument jeden dwa trzy cztery i przekazujesz je do funkcji. Te połączenia są równoważne.
źródło
Choć jest to brzydkie, oto obejście, które działa, o ile nie przekazujesz tablicy wprost, ale zmienna odpowiadająca tablicy:
Jestem pewien, że ktoś może wymyślić czystszą implementację tego pomysłu, ale uważam, że jest to lepsze rozwiązanie niż przekazywanie tablicy,
"{array[@]"}
a następnie uzyskiwanie do niej wewnętrznego dostępuarray_inside=("$@")
. Staje się to skomplikowane, gdy istnieją inne pozycje /getopts
parametry. W takich przypadkach musiałem najpierw określić, a następnie usunąć parametry niezwiązane z tablicą, używając kombinacjishift
usuwania elementu tablicy.Perspektywa purystyczna prawdopodobnie postrzega to podejście jako pogwałcenie języka, ale pragmatycznie rzecz biorąc, to podejście uratowało mi wiele smutku. W pokrewnym temacie używam również
eval
do przypisywania wewnętrznie skonstruowanej tablicy do zmiennej o nazwie zgodnej z parametremtarget_varname
przekazywanym do funkcji:źródło
array_internally
alias z nim:declare -n array_internally=$1
. Reszta o „komplikowaniu” i „określaniu, a następnie usuwaniu ...” ma zastosowanie niezależnie od tego, jak przekazujesz tablicę, więc nie rozumiem, o co w tym wszystkim chodzi. Aeval
tablica potencjalnie zawierająca znaki specjalne czeka tylko na smutek w późniejszym terminie.