È una cattiva pratica scrivere script di shell con molte statizioni if-else e loop?

3

Sto mantenendo diversi script della shell del processo dati che sono pieni di istruzioni if-else e di loop. Cerco di rendere gli scritps ordinati e facili da eseguire il debug.

Quando leggo alcuni suggerimenti sulle best practice del codice shell, sembra che non sia una best practice avere molte istruzioni if-else e for.

Quindi cosa dovrei fare, per scrivere uno script python o c ++ invece di quei processi logici?

    
posta xiao 14.10.2012 - 17:40
fonte

6 risposte

4

Non è mai una buona idea avere troppi incorporati se / else o cicli, ma a loro volta, i lotti non sono intrinsecamente una cosa negativa.

Considera di dividere i loop per le funzioni di utilità. Ad esempio, se hai:

for stuff ..
   for stuff ...

   endfor
endfor

Sarebbe molto meglio leggere come

findAllPricesForProducts( extractNamePriceTuple( data ) )

con le funzioni di utilità definite in modo appropriato. Se poi documenti ogni funzione e fornisci un esempio di input / output, il tuo codice dovrebbe essere sia leggibile che manutenibile.

    
risposta data 14.10.2012 - 17:52
fonte
3

Come un coder perl (questo potrebbe essere facilmente adattato a python) Ho sentito dire e mi sono detto "qualsiasi script di shell più lungo di 10 righe dovrebbe essere uno script perl". Gli script di shell oltre una certa soglia di dimensioni / complessità diventano spesso da incubo da mantenere. Passare a un linguaggio di scripting preferito può semplificare drasticamente questo (e allontanarsi dall'uso di chiamate ripetute grep, awk e sed (o altre applicazioni meno conosciute).

A parte la scelta della lingua, un altro commento che ho sentito è "se la funzione richiede la parola 'e' per descriverne la funzionalità, è troppo grande / complesso". Non è un problema avere istruzioni nidificate, ma se la logica attorno alle affermazioni diventa complessa, si dovrebbe prendere in considerazione l'estrazione di parti di essa in modo che sia qualcosa che si può tenere a mente mentre si esegue il debug ed è possibile testare semplicemente la funzionalità di esso.

    
risposta data 15.10.2012 - 16:24
fonte
2

Non ci sono problemi con l'uso di if e for-statement in uno script di shell. Il tuo codice è profondamente annidato in molte if / for-statement?

Non dimenticare che i linguaggi della shell dispongono di funzioni definite dall'utente per rendere il codice più modulare per la gestibilità.

    
risposta data 14.10.2012 - 17:50
fonte
1

L'argomento principale contro la scrittura di script di shell complessi è che sono difficili da debugare e facili da interrompere. Detto questo, semplicemente portare la stessa metodologia in un'altra lingua non sarebbe un miglioramento - è praticamente intrinseco se quello che stai facendo è unire un sacco di altri programmi.

    
risposta data 14.10.2012 - 21:46
fonte
0

Se dovresti riscrivere gli script in un linguaggio come Python dipende molto da

  • quanti script con quante righe di codice hai

  • quanti nuovi requisiti ti aspetti di aggiungerli nel prossimo futuro (se non ce ne sono, perché preoccuparti?)

  • quanto sono disordinati

  • quanto sei sicuro di poterli implementare davvero meglio senza introdurre nuovi bug

E prima di eseguire qualsiasi riscrittura, anche se è piccola come sembra essere nel tuo caso, leggi questo famoso articolo di Joel Spolsky perché una riscrittura è spesso una cattiva scelta.

    
risposta data 02.02.2013 - 13:08
fonte
0

Come in qualsiasi lingua ...

  • Cerca di non scrivere mai la stessa logica più di una volta
    • Forse uno script con molte istruzioni if-then può essere ridotto a poche funzioni.
  • Loops (do, for, while, repeat, until), per loro natura, sono motori semi-indipendenti. Sono analoghi ai motori elettrici in una macchina complessa. Gli errori in essi sono quasi universalmente la causa di tutti i "blocchi", "lockup", "100% CPU" e simili bug catastrofici.
    • Usare con parsimonia, suggerirei di non avere più loop simili. "Generizza" il codice in modo che lo stesso ciclo possa essere inserito in una funzione e riutilizzato con diverse variabili e condizioni. (da chi ha impiegato giorni per vedere una variabile 'l' (el) che avrebbe dovuto essere una 'i' (occhio))
risposta data 02.02.2013 - 12:49
fonte

Leggi altre domande sui tag