J'ai le script ci-dessous pour soustraire le nombre de fichiers entre deux répertoires mais l'expression COUNT=
ne fonctionne pas. Quelle est la syntaxe correcte?
#!/usr/bin/env bash
FIRSTV=`ls -1 | wc -l`
cd ..
SECONDV=`ls -1 | wc -l`
COUNT=expr $FIRSTV-$SECONDV ## -> gives 'command not found' error
echo $COUNT
Vous avez juste besoin d'un peu d'espace supplémentaire autour du signe moins et de points d'arrêt:
COUNT=`expr $FIRSTV - $SECONDV`
Soyez conscient de l'état de sortie:
L'état de sortie est 0 si EXPRESSION n'est ni nulle ni 0, 1 si EXPRESSION est nulle ou.
Gardez cela à l'esprit lorsque vous utilisez l'expression dans un script bash en combinaison avec set -e, qui se ferme immédiatement si une commande se termine avec un statut différent de zéro.
Essayez cette syntaxe Bash au lieu d'essayer d'utiliser un programme externe expr
:
count=$((FIRSTV-SECONDV))
En passant, la syntaxe correcte pour utiliser expr
est la suivante:
count=$(expr $FIRSTV - $SECONDV)
Mais gardez à l'esprit que l'utilisation de expr
sera plus lente que la syntaxe Bash interne I fournie ci-dessus.
Vous pouvez utiliser:
((count = FIRSTV - SECONDV))
pour éviter d'appeler un processus séparé, comme indiqué dans la transcription suivante:
pax:~$ FIRSTV=7
pax:~$ SECONDV=2
pax:~$ ((count = FIRSTV - SECONDV))
pax:~$ echo $count
5
L'espace blanc est important, expr
attend ses opérandes et ses opérateurs en tant qu'arguments séparés. Vous devez également capturer la sortie. Comme ça:
COUNT=$(expr $FIRSTV - $SECONDV)
mais il est plus courant d'utiliser l'extension arithmétique intégrée:
COUNT=$((FIRSTV - SECONDV))
Voici comment je fais toujours les maths dans Bash:
count=$(echo "$FIRSTV - $SECONDV"|bc)
echo $count
Alternativement aux 3 méthodes suggérées, vous pouvez essayer let
qui effectue des opérations arithmétiques sur les variables comme suit:
let COUNT=$FIRSTV-$SECONDV
ou
let COUNT=FIRSTV-SECONDV
Utilisez Python:
#!/bin/bash
# home/victoria/test.sh
START=$(date +"%s") ## seconds since Epoch
for i in $(seq 1 10)
do
sleep 1.5
END=$(date +"%s") ## integer
TIME=$((END - START)) ## integer
AVG_TIME=$(python -c "print(float($TIME/$i))") ## int to float
printf 'i: %i | elapsed time: %0.1f sec | avg. time: %0.3f\n' $i $TIME $AVG_TIME
((i++)) ## increment $i
done
Sortie
$ ./test.sh
i: 1 | elapsed time: 1.0 sec | avg. time: 1.000
i: 2 | elapsed time: 3.0 sec | avg. time: 1.500
i: 3 | elapsed time: 5.0 sec | avg. time: 1.667
i: 4 | elapsed time: 6.0 sec | avg. time: 1.500
i: 5 | elapsed time: 8.0 sec | avg. time: 1.600
i: 6 | elapsed time: 9.0 sec | avg. time: 1.500
i: 7 | elapsed time: 11.0 sec | avg. time: 1.571
i: 8 | elapsed time: 12.0 sec | avg. time: 1.500
i: 9 | elapsed time: 14.0 sec | avg. time: 1.556
i: 10 | elapsed time: 15.0 sec | avg. time: 1.500
$