it-swarm.com.de

So übergeben Sie ein Array-Argument an das Bash-Skript

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
22
zhihong

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
24
glenn jackman

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

12
anubhava

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
0
Dd H