Teoria di Bash

/ bin / bash

0. Indice

  1. Cose che accadono alla maggior parte delle persone
  2. Struttura di uno script
  3. Stampa sullo schermo
  4. Leggi l'INPUT dell'utente
  5. Calcoli in bash
  6. Condizioni
  7. Loop
  8. funzioni
  9. getops

1. Cose che accadono alla maggior parte delle persone

/ bin / bash o / bin / sh

Una delle prime cose che la macchina fa quando esegue il nostro script è guardare con quale shell dovrebbe farlo. Sulla maggior parte dei sistemi Linux attuali /bin/sh è un collegamento a / bin / bash, ma non è sempre così, ad esempio nelle distribuzioni che utilizzano occupato portare Sh e di solito portano anche Bash, ma se usi /bin/sh, non funzionerà con Bash. Ecco perché consiglio sempre di usare / bin / bash.

Unicode contro ASCII

Ti sei mai chiesto perché non puoi usare "¿" o "ñ" nei tuoi script? O usa gli accenti? Può essere abbastanza fastidioso negli script interattivi. Questo perché la codifica predefinita di Bash è ASCII o, cosa è la stessa, il set di caratteri inglese. Per cambiarlo, dobbiamo solo dire al nostro script che vogliamo usare Unicode. Per questo devi aggiungere una riga subito dopo l'interprete dei comandi:

# - * - CODIFICA: UTF-8 - * -

Fai attenzione, è importante che questa riga sia all'inizio dello script.

Rendi eseguibile lo script

È divertente quante persone eseguono gli script con «$ bashscript.sh" invece di "$ ./script.sh»Dopotutto, è per questo che abbiamo definito una shell.

Per aggiungere autorizzazioni di esecuzione, devi eseguire:

sudo + x script.sh
Se il nostro script è eseguibile, possiamo aggiungerlo al nostro PERCORSO e renderlo eseguibile da qualsiasi cartella / sul nostro computer. Per questo dobbiamo aggiungere o al .bashrc del nostro utente o a / etc / bashrc la riga
BIN = "cartella in cui abbiamo gli script" PATH = "$ BIN $ PATH"
È una regola Bash scrivere i nomi delle variabili in maiuscolo. Molte persone non seguono questa regola, ma per gli script lunghi è apprezzata perché li rendono molto più leggibili

2. Struttura di uno script

  1. Testa
  2. Definizione di variabili globali
  3. Aiuto
  4. funzioni
  5. Corpo principale

L'intestazione è dove indichiamo quale shell vogliamo usare e la codifica. Il vantaggio delle funzioni è di riutilizzare il codice che si ripete scrivendolo una sola volta e di rendere più facile la comprensione dello script, per codice che supera le 100 righe è molto utile.

Per poter utilizzare le funzioni, devono essere definite con prima del corpo principale del nostro script. E se vogliamo utilizzare variabili a livello globale di tutto il nostro script, sia nel corpo principale che nelle funzioni, dobbiamo definirle all'inizio di tutto, subito dopo l'intestazione.

Infine, è buona norma scrivere una funzione di supporto per quando il nostro script viene eseguito male o con parametri errati. Ovviamente in quei casi vogliamo uscire immediatamente dallo script, senza leggere le funzioni. Per questo possiamo usare:

funzione help () {echo "" "Il nostro testo di aiuto ben formattato." "" exit if [[-z $ 1 || $ 1 == "-h" || $ 1 == "--help"]]; quindi aiutare fi

Se aggiungiamo "exit" alla funzione di aiuto, usciremo dallo script ogni volta che eseguiamo help, ad esempio dopo messaggi di errore, ecc. Salviamo poche righe di codice.

La condizione indica la visualizzazione della guida sullo schermo e l'uscita se lo script viene eseguito senza parametri o se è specificato -h / –help. Se lo guardi, questo è il comportamento standard della maggior parte dei programmi Linux.

L'utilizzo delle 3 virgolette con echo consente di utilizzare interruzioni di riga senza lasciare che il messaggio venga visualizzato da echo. Per i messaggi su più righe è molto più conveniente usare l'eco solo una volta.

3. Stampa sullo schermo

Ci sono 2 comandi principali per stampare sullo schermo in bash: «eco"E"printf«. Sono entrambi altrettanto veloci ed entrambi fanno parte di bash. La differenza principale per un principiante è che l'eco aggiunge una nuova riga alla fine, mentre «printf"Non.

Echo è molto buono ed è quello che la maggior parte delle persone usa, tuttavia durante la lettura dell'INPUT dell'utente o quando si desidera stampare variabili prese da file mediante elaborazione di testi, possono accadere cose strane. Di solito sono facilmente risolvibili, facile come cambiare le virgolette doppie in singole o viceversa, o togliere i riferimenti variabili dalle virgolette. «Echo»Fa cose strane anche a seconda di come è stato compilato, se usiamo sempre Ubuntu o sempre Fedora, non ci riguarda, ma se cambiamo la distribuzione lo fa.

Ecco perché uso «printf«, Che non mi dà mal di testa e si comporta anche più come«printf»Da C o da«stampare»Di Python, questo è molto importante se vuoi portare il tuo script su un altro linguaggio di programmazione.

Per una discussione più ampia puoi visitare questa domanda da Unix e Linux su Stack Exchange.

4. Leggere l'INPUT dell'utente

Tutto ciò che scriviamo dopo il nome del nostro script e prima di premere il tasto INVIO viene automaticamente salvato in variabili speciali. Queste variabili sono del tipo $ X dove X è un numero.

«$0»Indica il nome del nostro script e da«$1»All'infinito tutto ciò che abbiamo scritto in seguito è variabile. Per esempio:

cat << EOF >> test.sh #! / bin / bash # - * - ENCODING: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh my file.txt

Creiamo uno script di test, lo rendiamo eseguibile e lo eseguiamo con 2 parametri. Otteniamo l'output dello schermo di:

$ 0 = ./script.sh $ 1 = mio $ 2 = file.txt

Usando le virgolette avremmo potuto passare "my file.txt" a "$ 1".

Possiamo anche leggere l'INPUT di un utente con il comando "read", indicando direttamente la variabile in cui vogliamo salvare il parametro. Per esempio:

printf "Come ti chiami? \ n" leggi NOME printf "Ciao, $ NAME. \ n"
Fai attenzione all'assegnazione delle variabili. "$ VAR = contenuto" produrrà un errore, non è possibile lasciare spazi tra il segno di uguale, il nome della variabile e il contenuto. L'utilizzo corretto è "VAR = contenuto"

5. Calcoli in Bash

Per questo possiamo usare «espr«Finché non abbiamo bisogno di fare calcoli complessi. Due cose da notare, la prima è che «espr»Ammette solo numeri interi, il secondo è che la divisione restituisce l'intero risultato, per vedere il resto possiamo usare«%«.

Di solito vogliamo assegnare il risultato di expr a una variabile. Possiamo farlo in due modi:

VAR2 = `espr $ VAR1 / 10` VAR2 = $ (espr $ VAR1 / 100)

Puoi anche saltare «espr»Utilizzo delle doppie parentesi:

VAR2 = $ (($ VAR1 / 100))
Per un'ulteriore spiegazione di «espr»O un'alternativa che utilizza numeri interi, puoi guardare questa voce KZKG ^ gaara.

6. condizioni

È già stato scritto in modo molto ampio su «if«,«altro«,«Elif»E le condizioni. Puoi leggere a riguardo in:

Voglio solo evidenziare la differenza tra l'uso di semplici parentesi quadre, «[]«, E doppie parentesi,«[[]]«, Per le condizioni. Con le doppie parentesi possiamo utilizzare condizioni aggiuntive:

  • «&&»Per e
  • «||»Per o

Usare "&&"E"||»Con semplici parentesi quadre, ogni parte deve essere separata in parentesi quadre separate. L'esempio utilizzato per la parte dello script che cerca di vedere se l'aiuto deve essere eseguito sarebbe:

se [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--help"]]; quindi aiutare fi

Inoltre ci evita di dover scrivere nomi di variabili tra virgolette per evitare errori. Per esempio:

se [$ 1 = 1]; quindi printf "Il parametro è uguale a 1."; fi if ["$ 1" = 1]; quindi printf "Il parametro è uguale a 1."; fi se [[$ 1 = 1]]; quindi printf "Il parametro è uguale a 1."; fi

Se script.sh viene eseguito senza alcun parametro, il primo caso restituirà un errore:

bash: [: =: operatore unario atteso
In Bash "=" e "==" sono entrambi interpretati allo stesso modo. Questo non accade in altri linguaggi di programmazione dove "=" viene utilizzato solo per assegnare variabili.

Quello di cui non si è parlato è «Custodie«, Usato per semplificare«if«. Partiamo dall'inizio, quando non ne abbiamo «if»Tutto il codice verrà eseguito. Se aggiungiamo una condizione «if»Avremo due casi, uno in cui il blocco di codice che si trova all'interno del«if»E l'altro caso in cui questo blocco non viene eseguito.

Se aggiungiamo un «altro«Avremo anche due casi, ma questi due casi sono diversi dai precedenti. Perché ora ci saranno due blocchi di codice condizionali, A e B, e un blocco C, che è il resto del programma. A o B verranno eseguiti e C.Nel caso precedente era A e C o solo C.

Per evitare condizioni di scrittura «se altro" entro "altro»E per semplificare la lettura del codice, è stato creato«Elif«. Quando abbiamo molte condizioni che dipendono dalla precedente, ad esempio intervallo di numeri o tipo:

VAR1 = $ 1 se [[$ VAR1 = 1]]; quindi printf "1 \ n" elif [[$ VAR1 = 2]]; quindi printf "2 \ n" elif [[$ VAR1 = 3]]; quindi printf "3 \ n" altrimenti printf "none \ n" fi

Nel caso dell'ultimo «Elif»Verranno lette molte condizioni. Con il caso questo processo è semplificato:

VAR1 = $ 1 caso $ VAR in 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 o 4, dipende \ n" ;; *) printf "nessuno \ n" ;; che C

Verrà letta una variabile, in questo caso VAR1, e verrà visualizzato se è equivalente a uno dei casi, in caso contrario verrà eseguito il caso predefinito "*". Il doppio punto e virgola è equivalente a «rompere", Loro dicono"Custodie»Questo deve finire.

«Caso»Può essere utilizzato anche come sequenza di«if«, Per questo devi usare« ;; & »(continua) invece di« ;; » (Stop).

7. Loop

Pochissimi loop sono noti in qualsiasi linguaggio di programmazione. In Bash sono «while«,«fino a quando"E"per«. È già stato scritto nel blog su questi:

Esistono due tipi di loop «per«, Quelli che sono del tipo«$ per VAR in LOQUESEA»E quali sono di tipo C«$ per ((I = 0; I <= 10; I ++))«. Il secondo tipo di loop «per»Sono molto utili, ha 3 parti all'inizio del ciclo:

  • Dichiarazione e inizio delle variabili (In questo caso una variabile ausiliaria "I = 0").
  • Condizione di esecuzione (fino a quando I è minore o uguale a 10).
  • Aumento della variabile ausiliaria

Secondo me è il loop più potente di tutti. Un esempio, che stampa tutti i numeri da 0 a 10, inclusi:

#! / bin / bash per ((I = 0; I <= 10; I ++)); printf "$ I \ n" fatto

8. Funzioni

Ci sono alcune cose che Bash non ci permette di fare, giusto? A prima vista, le funzioni bash ti impediscono di fare 3 cose: dichiarare variabili locali nelle funzioni, passare parametri alle funzioni e restituire parametri. Tutto ha una soluzione.

Non fare niente come:

#! / bin / bash VAR = 1 printc "$ VAR \ n" funzione ciao () {VAR = 2 printf "$ VAR \ n"} ciao printf "$ VAR \ n"

Viene stampato sullo schermo 1, 2 e 2.

Per dichiarare le variabili locali, aggiungi «locale»Quando si dichiara:

#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funzione foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"

Questo stampa 1, 1, 2, 1 sullo schermo.

Come si passano i parametri a una funzione?

#! / bin / bash # - * - CODIFICA: UTF-8 - * - funzione ciao () {printf "Ciao $ 1 \ n"}

printf "Come ti chiami? \ n"
leggi VAR1
ciao $ VAR1

Come vengono restituiti i parametri?

#! / bin / bash # - * - ENCODING: UTF-8 - * - function ciao () {printf "Hello holita"} printf "Come ti chiami? \ n" leggi VAR1 VAR1 = $ (ciao) # ECCO printf "$ VAR1 $ VAR2 \ n"

Come puoi vedere, questo ha due inconvenienti, puoi restituire solo un parametro, che può essere un vettore 😀, e se vuoi restituire un parametro, non puoi più stampare sullo schermo da quella funzione.

Puoi trovare ulteriori informazioni sulle funzioni su [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]questo articolo da Usemoslinux[/url].

9. Ottieni

Una delle ultime cose che devi sapere su Bash per creare script complessi è «getops«. Viene utilizzato per passare le opzioni allo script indipendentemente dall'ordine. L'unico svantaggio è che riguarda solo le opzioni brevi:

#! / bin / bash # - * - ENCODING: UTF-8 - * - VARC = 0 function help () {printf "Help message \ n" exit} if [[-z $ 1]]; quindi help fi while getopts: ha: b: c OPT; fai case $ OPT in h) help ;; :) Aiuto ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Aiuto ;; esac done # Blocco principale dello script che # fa cose con VARA, VARB e VARC

«Ottieni»Legge le opzioni una per una, quindi è necessario un ciclo.

Ci sono 2 tipi di opzioni che possono essere passate usando «getopts":

  • Parametri chiamati flag, in questo caso -c o -h. Sono specificati con la lettera che vogliamo utilizzare. Sono come variabili booleane, «vero»(Are) o«falso"(Non sono qui).
  • Parametri con argomenti associati, -a qualsiasi cosa, -b qualsiasi cosa. Sono specificati con la lettera che vogliamo con i due punti sotto. L'argomento è memorizzato in OPTARG (questo nome non è modificabile).
I punti doppi iniziali devono non mostrare errori.

Cosa fa questo script?

Visualizza il messaggio di aiuto quando non viene passata alcuna opzione, quando viene passato il parametro "-h", quando viene passato un parametro non valido (ad esempio "-x", questo viene fatto da "\?") O quando un parametro valido senza argomenti (":"). Nel resto dei casi salva la presenza di "-c" come 1 in VARC, e i valori passati con "-a" e "-b" in VARA e VARB.


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   vivace suddetto

    MAGISTRALE. Non dico più U_U

  2.   Miguel suddetto

    Ciao ottimo articolo.
    Ehi, hai messo per dare i permessi sudo + x invece di chmod + x

    1.    Henry suddetto

      $ sudo chmod + x script.sh
      (Per essere più precisi, hehe)

      Ah, complimenti e grazie!

  3.   freddo di fuoco suddetto

    Ottimo post, la verità è che mi congratulo con te, continua così, saluti

  4.   Gustavo suddetto

    E se vuoi che lo script sia visibile quando viene eseguito, passo dopo passo, vedendo ad esempio come si comportano variabili, condizioni e tutto, puoi usare:

    script sh -x

    saluti

  5.   dago suddetto

    PEZZO di tutela. Eccellente e molto ben spiegato.
    Grazie.

  6.   Gabriel suddetto

    Ottimo post sull'argomento 😉

  7.   Mario Guillermo Zavala Silva suddetto

    Molto interessante e importante, grazie per le informazioni….
    SALUTI !!!

  8.   Nondibrooklyn suddetto

    Grazie a tutti per le vostre congratulazioni, per quanto riguarda il comando Miguel, non mi permette di modificare la voce una volta pubblicata. Dovrà fare elav immagino.

  9.   Adrian suddetto

    Molto bene!

    Prima di tutto volevo congratularmi con te per il post, l'ho trovato facile da capire e aiuta davvero a seguire le linee guida per programmare bene in bash, soprattutto per le persone che stanno iniziando a programmare.

    Tuttavia ho trovato un paio di dettagli che penso dovrebbero essere corretti.

    Primo: nella sezione «2. STRUTTURA DI UNO SCRIPT »la funzione non è chiusa, il che causerà problemi durante l'esecuzione in uno script.
    La soluzione sarebbe aggiungere una parentesi graffa subito dopo il comando "exit".

    Secondo: nella sezione «4. LEGGI L'INPUT UTENTE ”affermi che i parametri che l'utente può inserire vanno da $ 0 a infinito, tuttavia“ bash ”interpreterà solo da $ 0 a $ 9, poiché $ 10 sarebbe uguale a $ 1 + 0.
    Per risolvere questo problema, puoi utilizzare il comando "shift" per acquisire le seguenti variabili. Oppure specifica la variabile tra parentesi graffe "$ {10}", in modo che bash prenda i valori insieme, non come $ 1 + 0.

    Senza ulteriori indugi, saluti!

    1.    Nondibrooklyn suddetto

      Grazie per il tuo commento. Non riusciva totalmente a spiegare il corretto utilizzo di exit, sia nello script che nelle funzioni. Per quanto riguarda $ {10} non ho mai lasciato così tanto in eredità, quindi non mi sono imbattuto in quel problema, è bello sapere che c'è una soluzione per questo (ho già cancellato la nuova cosa appresa oggi 😀).

  10.   chanio suddetto

    Grazie mille per l'articolo! Alcune cose di cui parli mancavano ancora di chiarimento. Ad esempio, getops.
    Nella parte delle uscite sullo schermo, hai dovuto menzionare il gatto che hai menzionato in seguito ...
    gatto <
    ***************************************
    * QUESTO MODULO È MOLTO ESPRESSIVO *
    ***************************************
    EOF

    Nel tuo esempio:
    cat << EOF >> test.sh
    Due cose dovrebbero essere menzionate ... >> è 'append' cioè, se ripeti lo stesso comando, avrai l'intero script in duplicato ... Dovresti usarne solo uno ...
    cat << EOF> script.sh
    Sì, dovrebbe anche essere chiamato script.sh
    Poi in
    se [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–help"]]; poi
    Aiuto
    fi

    Penso che dovrebbe essere scritto ...
    se [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–help"]]; poi
    ...

    C'è molto altro da scoprire da BASH.
    Potresti intitolarlo "BASICS"? 🙂
    Ad esempio, il parametro "tester" come -z per vedere se sono vuoti, o -f per vedere se esiste come file.

    Grazie ancora per il tuo impegno.
    alberto

  11.   clow_eriol suddetto

    Un ottimo tutorial per gli script bash!

  12.   OCZ suddetto

    -- CODIFICA: UTF-8 --

    È la prima volta che vedo quella riga per impostare la codifica dei caratteri in uno script bash. Sembra più tipico di Python che di Bash. È davvero necessario? Ho cercato un riferimento su Google ma non trovo nulla, hai un link a portata di mano che parla di questo argomento? In particolare sull'idoneità di quella linea.

    A mio parere, per scrivere script in Bash utilizzando UTF-8, è sufficiente salvare il file di testo come tale (senza BOM) e avere determinate variabili di ambiente, (LANG e LC_ *), impostate correttamente.
    Quindi, ovviamente, i comandi eseguiti devono essere preparati per codifiche diverse da ASCII. Ad esempio, se vogliamo andare in maiuscolo, questo non sembra funzionare:
    «Echo áéíóú | tr az AZ »
    o:
    «Echo áéíóú | tr [: lower:] [: upper:] »
    ed è meglio usare:
    «Echo áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Nondibrooklyn suddetto

      Riguardo a "codifica»È stato menzionato in questo blog prima:

      Bash: come rendere eseguibile uno script
      Script di utilità post installazione

    2.    borriquito come te suddetto

      Qualcuno mi ha corretto, ma quella riga di codifica (# -- CODIFICA: UTF-8 --) Non ha nulla a che fare con bash o la shell: è una riga di commento (inizia con #) e serve a dire all'EDITOR che usiamo per scrivere nello script (vim, emacs ...) la codifica del file.

      In effetti, bash non vede una riga del genere, perché è una riga di commento.

  13.   JoRgE-1987 suddetto

    Ottimo tutorial, poiché l'amministratore di sistema conosce lo scripting in Bash è essenziale, è utile per tutto.

    Molto molto bene!

    Saluti!

  14.   Edoardo Cuomo suddetto

    Nel caso in cui sia utile a chiunque, ecco diversi usi ed esempi per creare i tuoi script: https://github.com/reduardo7/hsabx

  15.   Lito Black suddetto

    Molto buona. Nuove cose da aggiungere ai miei script. La cosa encodig e la cosa printf non ce l'avevano.
    Grazie!!!

  16.   xxxtonixxx suddetto

    Articolo così buono! Tengo questo per i preferiti, sarebbe bello correggere ciò che non va e persino espanderlo con più contenuti. Un applauso per tutte queste informazioni !!!!