2013-06-21 16 views
17

To jest zaskakujące, że nie znajduję odpowiedzi po 1 godzinie szukania tego. Chciałbym przekazać tablicę do mojego skryptu tak:Jak przekazać argument tablicowy do skryptu Bash

test.sh argument1 array argument2 

nie chcę, aby umieścić to w innym skrypcie bash jak następuje:

array=(a b c) 
for i in "${array[@]}" 
do 
    test.sh argument1 $i argument2 
done 
+0

Zobacz także http://stackoverflow.com/a/1063367/2235132 – devnull

Odpowiedz

17

tablic Bash nie są „wartościami pierwszej klasy” - nie można przekazać je wokół jak jedną „rzecz”.

Zakładając test.sh jest skrypt bash, chciałbym zrobić

#!/bin/bash 
arg1=$1; shift 
array=("[email protected]") 
last_idx=$((${#array[@]} - 1)) 
arg2=${array[$last_idx]} 
unset array[$last_idx] 

echo "arg1=$arg1" 
echo "arg2=$arg2" 
echo "array contains:" 
printf "%s\n" "${array[@]}" 

i wywołać go jak

test.sh argument1 "${array[@]}" argument2 
+0

Świetna odpowiedź. Wiem, że to nie jest zgodne z wymaganiem OP z 'test.sh argument1 array argument2' ale jeśli inwokacja została zmieniona na' test.sh argument1 argument2 array' (tablica jest ostatnia), to byłoby mniej pracy. – doubleDown

+2

Dobra odpowiedź. Technicznie nie jest to przekazywanie tablicy do skryptu.Co jeśli OP musi przekazać 2 zmienne tablicowe do tego skryptu, takie jak 'test.sh argument1 tablica1 tablica2' – anubhava

9

Czy skrypt arrArg.sh tak:

#!/bin/bash 

arg1="$1" 
arg2=("${!2}") 
arg3="$3" 
arg4=("${!4}") 

echo "arg1=$arg1" 
echo "arg2 array=${arg2[@]}" 
echo "arg2 #elem=${#arg2[@]}" 
echo "arg3=$arg3" 
echo "arg4 array=${arg4[@]}" 
echo "arg4 #elem=${#arg4[@]}" 

setup teraz twoje tablice jak to w powłoce:

arr=(ab 'x y' 123) 
arr2=(a1 'a a' bb cc 'it is one') 

i przekazać argumenty takie jak ten:

. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]" 

Powyższy skrypt będzie druk:

arg1=foo 
arg2 array=ab x y 123 
arg2 #elem=3 
arg3=bar 
arg4 array=a1 a a bb cc it is one 
arg4 #elem=5 

Uwaga: To może wydawać się dziwne, że ja wykonywania skryptu za pomocą . ./script składnię. Zauważ, że służy to do wykonywania poleceń skryptu w bieżącym środowisku powłoki .

Pytanie: Dlaczego obecne środowisko powłoki i dlaczego nie podrzędna?
A. Ponieważ bash nie wyeksportować zmienne tablicowe do procesów potomnych jako documented here by bash author himself

+5

co jeśli dowolny element tablicy zawiera spacje? –

+1

To podejście biednego człowieka. – devnull

+0

@glennjackman: Zmieniono moje podejście, proszę sprawdzić teraz. – anubhava

-3

Jeśli jest to Twoja komenda:

test.sh argument1 ${array[*]} argument2 

Można odczytać tablicę do testu.sh tak:

arg1=$1 
arg2=${2[*]} 
arg3=$3 

Skarży się na ciebie ("złe zastąpienie"), ale zadziała.

Powiązane problemy