2014-08-27 10 views
9

Ho una chiamata con una bella lunga lista di argomenti a mio script di shell:Continua linea + commento linea, sulla stessa riga?

foo-command \ 
    --important-argument $ONE \ 
    --indispensable-flag $ENABLED \ 
    --an-optional-toggle "will probably be commented out some day" \ 
    $ARGUMENTS \ 
    $MORE_ARGUMENTS 

non posso inserire commenti in questa chiamata multilinea, posso?

Ad esempio, diciamo, come posso commentare la linea --an-optional-toggle?
Come posso aggiungere un commento dopo $ARGUMENTS?

Non importa quello che provo, octothorp # simbolo riga continuazione barra rovesciata \ o viceversa. Qualche consiglio?

risposta

6

No, ma è possibile memorizzare gli argomenti in una matrice. Ciò consente sia di commentare una singola riga sia di includere commenti interspati.

args=(--important-argument "$ONE" 
     --indispensable-flag "$ENABLED" 
     # --an-optional-toggle "will probably be commented out some day" 
     $ARGUMENTS # in sorted order 
     $MORE_ARGUMENTS 
    ) 
foo-command "${args[@]}" 

Nota che sarà quasi certamente vuole fare ARGUMENTS e MORE_ARGUMENTS array e, in modo args finirebbe per assomigliare

args=(--important-argument "$ONE" 
     --indispensable-flag "$ENABLED" 
     # --an-optional-toggle "will probably be commented out some day" 
     "${ARGUMENTS[@]}" # in sorted order 
     "${MORE_ARGUMENTS[@]}" 
    ) 
+0

+1 utilizzando gli array BASH è il modo giusto rispetto all'utilizzo di una riga di comando multilinea lunga. – anubhava

+0

Come nota a margine: questo è strettamente un approccio Bash-dipendente. Gli array non funzionano con le vecchie shell a.k.a "' sh' ", che possono essere importanti per qualcuno. – ulidtko

+1

Se sei preoccupato della portabilità, tagga la tua domanda 'sh' invece di' bash'. – chepner

1
foo-command $(
    # hello 
    printf --important-argument $ONE # free as a bird 
    printf --indispensable-flag $ENABLED 
    # to comment anywhere we wish 
    printf --an-optional-toggle "will probably be commented out some day" 
    printf $ARGUMENTS 
    printf $MORE_ARGUMENTS 
) 

non è perfetto: eco -n è difficile perché echo interpreta; le virgolette possono essere scomparse quando si preferisce tenerle, ecc. In effetti, come dicono i commentatori di seguito, la stringa citata verrà alterata; forse puoi ovviare a questo, ma altre risposte qui sono migliori se hai Bash.

+2

Se l'argomento per il commento opzionale contiene in realtà spazi bianchi, questo non funzionerà. – chepner

+1

Questo può essere migliorato. 'printf' invece di' echo' allevierà alcuni problemi, tra cui l'interpretazione di '-n' (e altri). La sostituzione dei comandi può essere in linea e eliminare una definizione di funzione aggiuntiva. – ulidtko

+0

Ragazzi, avete ragione, la risposta di @ chepner è praticamente una versione migliore di ciò che ho fatto qui. Tutti salutano il padrone di bash. –

5

Prova il commento backtick incidereas proposed in an earlier response alla stessa domanda.

Nel tuo caso, questo sarebbe:

foo-command \ 
    --important-argument $ONE \ 
    --indispensable-flag $ENABLED \ 
    `#--an-optional-toggle "will probably be commented out some day"` \ 
    $ARGUMENTS \ 
    $MORE_ARGUMENTS 
+1

Fare attenzione che la riga commentata non contenga di per sé sostituzioni di comandi, poiché verranno comunque espanse. – chepner