2013-06-21 18 views
17

Es ist überraschend, dass ich nicht die Antwort nach 1 Stunde Suche nach diesem finden. Ich möchte ein Array an mein Skript wie folgt weitergeben müssen:Wie man ein Array-Argument an das Bash-Skript übergeben

test.sh argument1 array argument2 

Ich will das nicht wie in anderen Bash-Skript setzen folgende:

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

Siehe auch http://stackoverflow.com/a/1063367/2235132 – devnull

Antwort

17

Bash-Arrays sind nicht „First-Class-Werte“ nicht exportieren - man kann sie nicht passieren können um wie ein „Ding“.

Unter der Annahme, test.sh ist ein Bash-Skript, würde ich

#!/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[@]}" 

tun und rufen Sie es wie

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

Große Antwort. Ich weiß, dass dies OPs Anforderung von "test.sh argument1 array argument2" nicht entspricht, aber wenn der Aufruf in "test.sh argument1 argument2 array" geändert wurde (das Array ist das letzte), wäre es weniger Arbeit. – doubleDown

+2

Gute Antwort. Aber technisch gibt es kein Array an ein Skript weiter.Was ist, wenn OP 2 Array-Variablen an dieses Skript übergeben muss wie 'test.sh argument1 array1 array2' – anubhava

9

Haben Sie Ihr Skript arrArg.sh wie folgt aus:

#!/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[@]}" 

Jetzt Setup Ihre Arrays wie dies in einer Schale:

und übergeben Argumente wie folgt aus:

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

obige Skript drucken:

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 

Hinweis: Es könnte seltsam erscheinen, dass ich Skript . ./script Syntax bin ausführen. Beachten Sie, dass dies zum Ausführen von Befehlen des Skripts in der aktuellen Shellumgebung dient.

Q. Warum aktuelle Shell-Umgebung und warum nicht eine Sub-Shell?
A. Da bash Array-Variablen zu Child-Prozesse als documented here by bash author himself

+5

Was passiert, wenn eines der Array-Elemente Whitespace enthält? –

+1

Dies ist der Ansatz des armen Mannes. – devnull

+0

@glennjackman: Mein Ansatz geändert, bitte überprüfen Sie jetzt. – anubhava

-3

Wenn dies Ihr Befehl lautet:

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

Sie das Array lesen in test.sh wie folgt:

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

Es wird bei Ihnen beschweren ("schlechte Substitution"), wird aber funktionieren.

Verwandte Themen