Come passare un argomento di matrice per lo script Bash

È sorprendente per me che non trovo la risposta dopo 1 ora di ricerca per questo.
Vorrei passare una matrice a mio script come questo:

test.sh argument1 array argument2

Io NON voglio mettere questo in un altro bash script come il seguente:

array=(a b c)
for i in "${array[@]}"
do
  test.sh argument1 $i argument2
done
InformationsquelleAutor zhihong | 2013-06-21

 

4 Replies
  1. 29

    Bash matrici non sono “di prima classe” valori-che non si può passare intorno a loro come una “cosa”.

    Assumendo test.sh è uno script bash, vorrei fare

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

    E richiamarlo come

    test.sh argument1 "${array[@]}" argument2
    • Grande risposta. So che questo non conforme alle OP del requisito di test.sh argument1 array argument2 ma se l’invocazione è stato modificato per test.sh argument1 argument2 array (l’array di essere l’ultimo), sarebbe meno lavoro.
    • Buona risposta. Ma tecnicamente non è il passaggio di un array ad uno script. Che cosa succede se l’OP deve passare 2 array di variabili di questo script come test.sh argument1 array1 array2
    • + per la prima classe del cittadino termine
    • Si noti che è necessario dichiarare la matrice prima di chiamare lo script. Per l’OP, questo significherebbe $ array=(a b c) e poi test.sh argument1 "${array[@]}" argument2 . Potrebbe essere solo me che avevano a pensare che un po’, ma sto commentando, nella speranza che possa aiutare qualcuno.
  2. 14

    Avere il tuo script arrArg.sh come questo:

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

    Ora di configurazione del vostro array come questo in una shell:

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

    E passare argomenti come questo:

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

    Sopra script stampa:

    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

    Nota: potrebbe sembrare strano che io sia l’esecuzione di script utilizzando . ./script sintassi. Nota che questo è per l’esecuzione di comandi di script in ambiente di shell corrente.

    D. Perché l’attuale ambiente di shell e perché non un sotto-shell?

    A. Perché bash non esportare le variabili di matrice di processi figlio come qui documentato da bash stesso autore

    • che cosa succede se uno qualsiasi degli elementi della matrice contiene spazi vuoti?
    • Questo è povero approccio.
    • Cambiato il mio approccio, pls controllare ora.
    • bel lavoro. è difficile ma necessario.
    • grazie molto. Gli elementi del mio array non hanno spazio. Ma sia il vostro e glenn risposte di nizza.
    • Quando ho eseguito il codice, arg2=(“${!2}”) per questa linea sono trovato Male Sostituzione
    • Questo è super, super intelligente e fatto le mie conchiglie script fantastico!!!

  3. 0

    È possibile scrivere la matrice in un file, poi origine il file nel vostro script.
    ad esempio:

    array.sh

    array=(a b c)

    test.sh

    source $2
    ...

    Eseguire il test.sh script:

    ./test.sh argument1 array.sh argument3
  4. -3

    Se questo è il vostro comando:

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

    Si può leggere l’array in test.sh come questo:

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

    Si lamenterà a voi (“bad sostituzione”), ma funziona.

Lascia un commento