# ✨ LA GUIDA DEFINITIVA: BASH
:::success
:email: Ciao!
La serie delle **"GUIDE DEFINITIVE"** è un progetto creato in parte per scherzo e in parte per aiutare chi ne ha bisogno. Se riscontri problemi, errori o simili, puoi inviarmi un messaggio su Telegram tramite ([@clipwav](https://t.me/clipwav)), cercherò di rispondere il prima possibile!
#### Grazie mille! :heart:
:::
**Bash** (Bourne-Again SHell) è un linguaggio di **scripting** (e non di programmazione) e un interprete di comandi per l'ambiente Unix/Linux.
Questa guida ti aiuterà a imparare i comandi più comuni e le funzionalità di base di Bash!
:::warning
## Prerequisiti
Per scrivere script in Bash, ti servirà
- [ ] Un computer con qualunque sistema basato su **Unix/Linux**, questo include **Ubuntu** e **MacOS**, anche tramite **Macchina Virtuale**
(Non hai una VM a disposizione? [Ho scritto una guida per crearne una!](/kfERMoIbTkWwPSl3Uu5FqQ) 😉 )
- [ ] Un **editor di testo** (Vim, Nano, TextEdit)
- [ ] Tanta, tanta pazienza (opzionale)
:::
# Introduzione
Bash è una shell di comando, ovvero un programma che **interpreta** i comandi che digiti e li **esegue**.

Offre molte funzionalità avanzate, come la possibilità di scrivere script, di creare alias e di automatizzare le operazioni.
# Comandi di base
Iniziamo con le basi, proviamo ad eseguire un **comando**.
Apri il terminale e digita:
```bash
echo "Ciao Mondo!"
```
Questo comando stamperà "Ciao Mondo!" a schermo. `echo` è un comando che semplicemente stampa il testo che gli viene passato come argomento.
:::info
#### 📚 **Argomento**
Un argomento è un valore che viene passato a un comando o a un programma. Ad esempio, in `echo "Ciao Mondo!"`, "Ciao Mondo!" è l'argomento passato al comando `echo`.
:::
## Redirezione dell'output
Uno dei concetti fondamentali di Bash è la **redirezione dell'output**. Puoi utilizzare i seguenti operatori per redirigere l'output di un comando:
- `>` - Reindirizza l'output in un file, sovrascrivendo il contenuto esistente
- `>>` - Reindirizza l'output in un file, aggiungendo al contenuto esistente
- `|` - Pipe, reindirizza l'output di un comando come input di un altro comando
Esempio:
```bash
echo "Questo è un esempio" > file.txt # Scrive "Questo è un esempio" in file.txt
echo "Altra riga" >> file.txt # Aggiunge "Altra riga" in file.txt
cat file.txt | grep "esempio" # Stampa le righe di file.txt che contengono "esempio"
```
## Variabili
In Bash, puoi definire e utilizzare variabili. Ecco alcuni esempi:
```bash
nome="Mario" # Assegnazione di un valore a una variabile
echo "Ciao $nome" # Stampa "Ciao Mario"
```
Per accedere al valore di una variabile, basta anteporre il carattere `$` al suo nome.
## Variabili di ambiente
Le variabili di ambiente sono un tipo speciale di variabili che memorizzano informazioni sull'ambiente di sistema. Alcune variabili di ambiente comuni sono:
- `$HOME` - Il percorso della directory home dell'utente
- `$PATH` - Un elenco di directory in cui il sistema cerca i comandi eseguibili
- `$PWD` - Il percorso della directory corrente
Puoi visualizzare tutte le variabili di ambiente con il comando `env` o `printenv`.
## Comandi comuni
Ecco alcuni comandi Bash comuni che vale la pena conoscere:
- `ls` - Elenca i file e le directory (Sintassi: `ls [opzioni] [directory]`)
- `cd` - Cambia directory (Sintassi: `cd [directory]`)
- `mkdir` - Crea una nuova directory (Sintassi: `mkdir [directory]`)
- `rm` - Rimuove file o directory (Sintassi: `rm [opzioni] [file/directory]`)
- `cp` - Copia file o directory (Sintassi: `cp [opzioni] [origine] [destinazione]`)
- `mv` - Sposta o rinomina file o directory (Sintassi: `mv [opzioni] [origine] [destinazione]`)
- `cat` - Visualizza il contenuto di un file (Sintassi: `cat [file]`)
- `grep` - Cerca un pattern in uno o più file (Sintassi: `grep [opzioni] [pattern] [file]`)
- `find` - Cerca file in una directory (Sintassi: `find [directory] [opzioni]`)
Questi sono solo alcuni dei comandi più comuni. Ce ne sono molti altri, quindi ti consiglio di esplorare ulteriormente per scoprire cosa puoi fare con Bash!
Se hai dubbi, utilizza il comando `man` seguito dal nome del comando per visualizzare il manuale del comando. Ad esempio, `man ls` ti mostrerà il manuale del comando `ls`!
# Script Bash
Gli script Bash sono semplicemente file di testo contenenti una sequenza di comandi Bash. Possono essere eseguiti dal terminale e sono molto utili per automatizzare attività ripetitive.
Per creare uno script, apri un editor di testo e digita i comandi desiderati, uno per riga. Salva il file con un'estensione `.sh`. Quindi, apri il terminale, naviga nella directory in cui si trova il file e digita:
```bash
chmod +x nome_script.sh # Rende lo script eseguibile
./nome_script.sh # Esegue lo script
```
## Esempio di script
Ecco un semplice script che chiede all'utente il suo nome e lo saluta:
```bash
#!/bin/bash
echo "Qual è il tuo nome?"
read nome
echo "Ciao $nome, benvenuto!"
```
Salva questo script come `saluto.sh`, rendi l'eseguibile con `chmod +x saluto.sh` e poi eseguilo con `./saluto.sh`.
All'interno degli script, puoi anche utilizzare costrutti di controllo come `if`, `for` e `while`, nonché funzioni per organizzare meglio il codice.
### Istruzioni condizionali
Le istruzioni condizionali `if` ti permettono di eseguire codice solo se una certa condizione è vera. Ecco un esempio:
```bash
età=25
if [ $età -lt 18 ]; then
echo "Non sei ancora maggiorenne."
elif [ $età -ge 18 ] && [ $età -lt 65 ]; then
echo "Sei un adulto."
else
echo "Sei un pensionato."
fi
```
In questo esempio, l'istruzione `if` controlla l'età e stampa un messaggio appropriato. Gli operatori di confronto utilizzati sono `-lt` (minore di), `-ge` (maggiore o uguale a) e `-lt` (minore di).
### Cicli
I cicli `for` e `while` ti permettono di iterare su una serie di valori o di eseguire un blocco di codice finché una certa condizione è vera.
```bash
# Ciclo for
for i in 1 2 3 4 5
do
echo "Valore di i: $i"
done
# Ciclo while
count=1
while [ $count -le 5 ]
do
echo "Conteggio: $count"
((count++))
done
```
### Funzioni
Le funzioni ti permettono di raggruppare comandi e riutilizzarli facilmente negli script.
```bash
# Definizione di una funzione
saluta() {
echo "Ciao $1, benvenuto!"
}
# Chiamata della funzione
saluta Mario # "Ciao Mario, benvenuto"
saluta Luigi # "Ciao Luigi, benvenuto"
```
## Operatori di confronto
Negli script Bash, puoi utilizzare diversi operatori di confronto nelle istruzioni condizionali e nei cicli:
- `-eq` (uguale a)
- `-ne` (diverso da)
- `-gt` (maggiore di)
- `-ge` (maggiore o uguale a)
- `-lt` (minore di)
- `-le` (minore o uguale a)
## Gestione degli errori
La gestione degli errori è importante per scrivere script robusti. Puoi catturare e gestire i codici di uscita dei comandi e utilizzare le istruzioni `set -e` e `set -o pipefail`.
```bash
# Termina lo script se un comando restituisce un codice di errore diverso da 0
set -e
# Termina lo script se un comando in una pipeline restituisce un codice di errore diverso da 0
set -o pipefail
# Esempio di gestione degli errori
mkdir dir || echo "Impossibile creare la directory"
```
## Espansioni e sostituzioni
Bash offre diverse forme di espansione e sostituzione che ti permettono di manipolare e utilizzare in modo flessibile le variabili, le stringhe e i comandi.
- Espansione delle variabili: `echo $VAR`
- Espansione delle stringhe: `echo "La data è ${TODAY}"`
- Sostituzione dei comandi: `TODAY=$(date +%Y-%m-%d)`
## Suggerimenti e best practice
- Usa nomi **descrittivi** per le variabili e le funzioni.
- **Commenta** il tuo codice per renderlo più leggibile. (specialmente se lavori in team!)
- Utilizza gli strumenti di controllo della versione per tenere traccia delle modifiche ai tuoi script. (**git** 💜)
- Segui le linee guida di stile e le best practice comunemente accettate per la scrittura di script Bash.
## Risorse aggiuntive
- [Bash Guide for Beginners](https://tldp.org/LDP/Bash-Beginners-Guide/html/index.html)
- [Advanced Bash-Scripting Guide](https://tldp.org/LDP/abs/html/index.html)
- [Bash Scripting Tutorial for Beginners](https://linuxconfig.org/bash-scripting-tutorial-for-beginners)
- [GNU Bash Manual](https://www.gnu.org/software/bash/manual/bash.html)
# Conclusione
Bash è uno strumento essenziale per qualsiasi utente di Unix/Linux. Conoscere i comandi di base e le funzionalità di Bash ti aiuterà a lavorare più efficientemente e a sfruttare appieno il potenziale del tuo sistema operativo.
Se questa guida ti è stata utile, ti invito a condividerla con i tuoi amici.
E se hai domande o suggerimenti, non esitare a contattarmi!
**Buon divertimento con Bash! 🎉**