Intro

Variabili

NAME="Qsl"
echo $VAR
echo "$VAR"
echo "${VAR}"

Apici stringhe

NAME="Qsl"
echo "Hello $NAME"  ->  Hello Qsl
echo 'Hello $NAME'  ->  Hello $NAME

Inserire comandi

echo "Mi trovo in $(pwd)"
echo "Mi trovo in `pwd`"

Funzioni

print_world() {
    echo "World!"
}

echo "Hello $(print_world)"  ->  Hello World!

Loops

Base

for i in /etc/rc.*; do
    echo $i
done

Range

for i in {1..10}; do
    echo $i
done

# con incremento
for i in {0..100..10}; do
    echo $i
done

C-like

for ((i = 0 ; i < 100 ; i++)); do
    echo $i
done

Leggere righe di un file

cat file.txt | while read line; do
    echo $line
done

Ciclo infinito

while true; do
    [...]
done

Funzioni

Definizione

myfun() {
    echo "Hello $1"
}

# Sintassi alternativa
function myfun() {
    echo "Hello $1"
}

myfun "Qsl"  ->  Hello Qsl

Argomenti

  • $# numero di argomenti
  • $* tutti gli argomenti (come singole parole)
  • $@ tutti gli argomenti (come stringhe separate)
  • $1 primo argomento
  • $_ ultimo argomento del comando precedente

N.B. $@ e $* devono essere usate con i doppi apici per avere questo comportamento, altrimenti fanno la stessa cosa (separano gli argomenti come stringhe)

Ritorno valori

myfun() {
    local res='Qsl'
    echo $res
}

result="$(myfun)"
echo $result  ->  Qsl

Errori

myfun() {
    return 1
}

if myfun; then
    echo "success"
else
    echo "failure"
fi                  ->  failure

Condizionali

Stringhe e Numeri

Pattern Significato
[[ -z STRING]] Stringa vuota
[[ -n STRING]] tringa non vuota
[[ STRING == STRING ]] Uguali
[[ STRING != STRING ]] Diverse
[[ STRING =~ pattern ]] Regexp
[[ NUM -eq NUM ]] Uguali
[[ NUM -ne NUM ]] Diversi
[[ NUM -lt NUM ]] Minore
[[ NUM -le NUM ]] Minore o uguale
[[ NUM -gt NUM ]] Maggiore
[[ NUM -ge NUM ]] Maggiore o uguale
(( NUM > NUM )) Condizioni aritmetiche

File

Pattern Significato
[[ -e FILE ]] Esiste
[[ -r FILE ]] Leggibile
[[ -h FILE ]] Symlink
[[ -d FILE ]] Directory
[[ -w FILE ]] Scrivibile
[[ -s FILE ]] Dimensione è > 0 bytes
[[ -f FILE ]] File normale
[[ -x FILE ]] Eseguibile
[[ FILE1 -nt FILE2 ]] 1 più recente di 2
[[ FILE1 -ot FILE2 ]] 2 più recente
[[ FILE1 -ef FILE2 ]] Stessi file

Logica

Pattern Significato
[[ ! EXPR ]] Not
[[ X && Y ]] And
[[ X || Y ]] Or

Array

Definizione

Giorni=('lun' 'mar' 'mer' 'gio')

# Sintassi alternativa
Giorni[0]='lun'
Giorni[1]='mar'
Giorni[2]='mer'
Giorni[3]='gio'

Indicizzazione

echo ${Giorni[0]}           # Elemento #0
echo ${Giorni[-1]}          # Ultimo elemento
echo ${Giorni[@]}           # Tutti gli elementi, separati da spazio
echo ${#Giorni[@]}          # Numero di elementi
echo ${#Giorni}             # Lunghezza stringa del primo elemento
echo ${#Giorni[N]}          # Lunghezza stringa del N-esimo elemento
echo ${Giorni[@]:1:2}       # Range (da elemento di indice 1 al 2)
echo ${!Giorni[@]}          # Indice di tutti gli elementi, separati da spazio

Operazioni

Giorni=("$Giorni[@]" "ven")                 # Push
Giorni+=('gio')                             # Altro push
Giorni=( ${Giorni[@]/lu*/} )                # Rimuovi elementi con regex match
unset Giorni[2]                             # Rimuovi elemento per indice
GiorniDup=("${Giorni[@]}")                  # Duplicazione
GiorniCon=("${Giorni[@]}" "${Giorni[@]}")   # Concatenazione
lines=(`cat "file"`)                        # Crea array dalla lettura del file

Iterazione

for i in "${Giorni[@]}"; do
    echo $i
done

Dizionari

Definizione

declare -a voti
voti[fisica]=25
voti[matematica]=30
voti[inglese]="sv"

Operazioni

echo ${voti[fisica]}    # valore della chiave 'fisica'
echo ${voti[@]}         # tutti i valori
echo ${!voti[@]}        # tutte le chiavi
echo ${#voti[#]}        # numero di elementi
unset voti[fisica]      # rimuovi

Iterazione

# iterare per valore
for val in "${voti[@]}"; do
    echo $val
done

# iterare per chiave
for key in "{!voti[@]}"; do
    echo $key
done