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