2012-06-22 6 views
5

Così ho uno script bash che ha bisogno di prendere un numero arbitrario di argomenti della riga di comando e metterli in una singola stringaafferrare tutti argomenti che seguono argomento ennesima e concatenare insieme in bash

Esempio di ciò che l'utente digiterà in:

give <environment> <email> <any number of integers separated by spaces> 
give testing [email protected] 1 2 3 4 5 

Voglio ottenere tutti gli argomenti da $ 3 a $ # e concatenarli in una stringa.

La mia soluzione (probabilmente terribile) in questo momento è

if [ $# -gt 3 ] 
then 
    env="env="$1 
    email="email="$2 
    entList="" 

    for i in {3..$#} 
    do 
     if [ $i -eq 3 ] 
      then 
        entList=$3 
        shift 
      fi; 
      if [ $i -gt 3 ] 
      then 
        entList=$entList","$3 
        shift 
      fi; 
    done 
fi; 

ho gestire il caso di avere solo tre argomenti un po 'diverso, e che uno funziona bene.

valore finale $entList dato l'esempio give testing [email protected] 1 2 3 4 5 dovrebbe essere: 1,2,3,4,5

In questo momento quando ho eseguito questo ho i seguenti errori:

/usr/local/bin/ngive.sh: line 29: [: {3..5}: integer expression expected 
/usr/local/bin/ngive.sh: line 34: [: {3..5}: integer expression expected 

Linee 29 e 34 sono:

line 29: if [ $i -eq 3 ] 
line 34: if [ $i -gt 3 ] 

Qualsiasi aiuto sarebbe apprezzato.

+1

Una soluzione comune è salvare i primi 3 argomenti, ad esempio in variabili: 'var1 =" $ 1 "; var2 = "$ 2"; var3 = "$ 3" 'e quindi usare' shift 3' per rimuovere i primi 3 argomenti, e successivamente usare '" $ * "' per creare una singola stringa contenente gli altri parametri, separati da spazio: 'rest =" $ * "' . –

risposta

6

Sei sulla strada giusta. Ecco il mio consiglio:

if [ $# -ge 3 ]; then 

    env="$1" 
    email="$2" 
    entlist="$3" 

    while shift && [ -n "$3" ]; do 
    entlist="${entlist},$3" 
    done 

    echo "entlist=$entlist" 

else 

    echo "Arguments: $*" 

fi 

nota che le variabili dovrebbero sempre essere messi all'interno virgolette. Non sono sicuro del motivo per cui stavi impostando env=env=$1, ma sospetto che, se desideri riciclare tale valore in un secondo momento, dovresti farlo a livello di programma piuttosto che valutare la variabile come se si trattasse di una dichiarazione, nel caso fosse il tuo piano.

4

Skip primi tre argomenti utilizzando un sottoarray:

all=(${@}) 
IFS=',' 
threeplus="${all[*]:3}" 
+0

Giusto per essere chiari, l'assegnazione a 'IFS' e l'array quotato con' * 'come pedice fa sì che il primo carattere del contenuto di' IFS' venga emesso tra ciascun elemento dell'array. –

1

Il motivo che stai ricevendo quei messaggi di errore è che in:

for i in {3..$#} 

L'espansione delle parentesi graffe è effettuata prima della espansione di parametro e così il if dichiarazione seguente è valutato come:

if [ {3..$#} -eq 3 ] 

che non è valido.

Modificare l'istruzione for di utilizzare lo stile C:

for ((i = 3; i <= $#; i++)) 

usare questo stile per il confronto intero:

if (($# > 3)) 

e

if ((i == 3)) 

e

if ((i > 3)) 

mettere il vostro parametri all'interno delle virgolette:

env="env=$1" 
email="email=$2" 

e

entList="$entList,$3" 

anche se le virgolette non sono necessarie in quanto la suddivisione delle parole non viene eseguita sul lato destro di un incarico e si' Non assegnando caratteri speciali come spazi bianchi, punti e virgola, pipe, ecc.

Problemi correlati