Es überrascht mich, dass ich nach 1-stündiger Suche nach dieser Antwort keine Antwort finde. Ich würde gerne ein Array an mein Skript übergeben:
test.sh argument1 array argument2
Ich möchte dies NICHT in ein anderes Bash-Skript wie folgt einfügen:
array=(a b c)
for i in "${array[@]}"
do
test.sh argument1 $i argument2
done
Bash-Arrays sind keine "erstklassigen Werte" - Sie können sie nicht wie eine "Sache" herumgeben.
Angenommen, test.sh
ist ein bash-Skript, würde ich tun
#!/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[@]}"
Und ruft es gerne an
test.sh argument1 "${array[@]}" argument2
Haben Sie Ihr Skript arrArg.sh
so:
#!/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[@]}"
Richten Sie nun Ihre Arrays in einer Shell folgendermaßen ein:
arr=(ab 'x y' 123)
arr2=(a1 'a a' bb cc 'it is one')
Und Argumente wie folgt weitergeben:
. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]"
Das obige Skript wird gedruckt:
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 kann seltsam erscheinen, dass ich ein Skript mit der . ./script
-Syntax ausführte. Beachten Sie, dass dies zur Ausführung von Befehlen des Skripts in der aktuellen Shell-Umgebung dient.
Q. Warum aktuelle Shell-Umgebung und warum keine Sub-Shell?
A. Weil bash keine Array-Variablen in untergeordnete Prozesse exportiert, wie hier von bash author dokumentiert
Sie können Ihr Array in eine Datei schreiben und dann die Datei in Ihr Skript packen.
array.sh
array=(a b c)
test.sh
source $2
...
Führen Sie das Skript test.sh aus:
./test.sh argument1 array.sh argument3