08 novembre, 2019

Bash scripts - cose che devo ricordarmi - 2


Continuando con un tormentone (non lo è ancora ma lo diventerà, promesso) oggi calcoli aritmetici con Bash. Non è che sia il massimo ma quando serve Bash può fare operazioni aritmetiche, solo per numeri interi. Come esercizio provo a creare un calcolatore elementare. È solo un gioco, nèh! da non prendere troppo seriamente.

Le possibilità aritmetiche di Bash sono descritte qui: Shell Arithmetic.

Una prova pratica, comincio con questo script (sa1):

N=$1
M=$2
echo 'calcoli relativi a' $N 'e' $M
echo 'incremento (N++ e ++N):' $(( N++ )) \

'diventa' $N 'e poi ' $(( ++N ))
echo 'decremento (N-- e --N):' $(( N-- )) \
'diventa' $N 'e poi ' $(( --N ))
echo '+ e - unari:' $(( -N )) $(( +N ))
echo 'valore logico e negazione bitwise:' \
$(( !N )) 'e' $(( ~N ))
echo 'elevazione a potenza:' $N'^'$M'= ' $(( N ** M ))


lo lancio ed ecco

$ bash sa1 4 3
calcoli relativi a 4 e 3
incremento (N++ e ++N): 4 diventa 5 e poi  6
decremento (N-- e --N): 6 diventa 5 e poi  4
+ e - unari: -4 4
valore logico e negazione bitwise: 0 e -5
elevazione a potenza: 4^3=  64

$


Sì, funziona, continuo (sa2):

N=$1
M=$2
echo 'calcoli relativi a' $N 'e' $M
echo 'moltiplicazione:' $N '*' $M '=' $(( N * M ))
echo 'divisione:' $N '/' $M '=' $(( N / M ))
echo 'modulo (resto):' $N '%' $M '=' $(( N % M ))


ed ottengo

$ bash sa2 7 3
calcoli relativi a 7 e 3
moltiplicazione: 7 * 3 = 21
divisione: 7 / 3 = 2
modulo (resto): 7 % 3 = 1

$


ancora (sa3):

N=$1
M=$2
echo 'calcoli relativi a' $N 'e' $M
echo 'addizione:' $N '+' $M '=' $(( N + M ))
echo 'sottrazione:' $N '-' $M '=' $(( N - M ))
echo 'shift a sinistra<<:' $N '<<' $M '=' $(( N << M ))
echo 'shift a destra  >>:' $N '>>' $M '=' $(( N >> M ))
echo 'comparazione <=, >=, <, >:' $(( N <= M )) \
$(( N >= M )) $(( N < M )) $(( N > M )) 


che produce:

$ bash sa3 8 3
calcoli relativi a 8 e 3
addizione: 8 + 3 = 11
sottrazione: 8 - 3 = 5
shift a sinistra<<: 8 << 3 = 64
shift a destra  >>: 8 >> 3 = 1
comparazione <=, >=, <, >: 0 1 0 1

$


E si potrebbe continuare con gli altri operatori descritti nella pagina citata. Ma credo basti, ormai si è capito. Piuttosto un paio di approfondimenti.

All'interno delle doppie-parentesi le variabili possono essere immesse sia con il prefisso $ che senza (come ho fatto finora); in certi casi è necessario o almeno opportuno per leggibilità (sa-dol):

N=$1
M=$2
echo $N '*' $M '=' $(( N * M ))
echo 'o anche'
echo $N '*' $M '=' $(( $N * $M ))
echo 'e infine'
echo 'con gli argomenti originari:' $(( $1 * $2 )) \

'è diverso da' $(( 1 * 2 )) 

$
bash sa-dol 3 4
3 * 4 = 12
o anche
3 * 4 = 12
e infine
con gli argomenti originari: 12 è diverso da 2

$


Con la divisione si ottiene sempre l'arrotondamento per difetto (quello di solito indicato come floor), si può facilmente rimediare --uh! post troppo lungo, pausa, continuo nel prossimo 🤪
🔴

Nessun commento:

Posta un commento