J'ai le script ci-dessous pour soustraire le nombre de fichiers entre deux répertoires mais l' COUNT=
expression 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
Réponses:
Vous avez juste besoin d'un petit espace supplémentaire autour du signe moins et des astuces:
Soyez conscient du statut de sortie:
L'état de sortie est 0 si EXPRESSION n'est ni nul ni 0, 1 si EXPRESSION est nul ou 0 .
Gardez cela à l'esprit lorsque vous utilisez l'expression dans un script bash en combinaison avec set -e qui se fermera immédiatement si une commande se termine avec un état différent de zéro.
la source
sh
shell posix . Pour la portabilité, vous pouvez utiliser cette réponse.Essayez cette syntaxe Bash au lieu d'essayer d'utiliser un programme externe
expr
:BTW, la syntaxe correcte de l'utilisation
expr
est:Mais gardez à l'esprit que l'utilisation
expr
sera plus lente que la syntaxe Bash interne que j'ai fournie ci-dessus.la source
$(command)
syntaxe pour la substitution de commandes. De plus, étant donné que BASH prend en charge les opérations arithmétiques,$(( ... ))
il est préférable de ne pas utiliser d'utilitaire externeexpr
$(( ... ))
est utilisé pour évaluer les expressions arithmétiques.Vous pouvez utiliser:
pour éviter d'appeler un processus distinct, selon la transcription suivante:
la source
L'espace blanc est important,
expr
attend ses opérandes et opérateurs comme arguments séparés. Vous devez également capturer la sortie. Comme ça:mais il est plus courant d'utiliser l'expansion arithmétique intégrée:
la source
C'est comme ça que je fais toujours des maths dans Bash:
la source
|bc
commande de type plutôt que de la rater une ou deux fois. Différents traits pour différentes personnes comme on dit.Pour une arithmétique entière simple, vous pouvez également utiliser la commande let intégrée .
Pour plus d'informations sur
let
, regardez ici .la source
let "sanity_check_duration=sanity_check_duration_end_time_delay_sec - sanity_check_duration_start_time_delay_sec"
(en supprimant le signe dollar des variables)Alternativement aux 3 méthodes suggérées, vous pouvez essayer d'
let
effectuer des opérations arithmétiques sur les variables comme suit:let COUNT=$FIRSTV-$SECONDV
ou
let COUNT=FIRSTV-SECONDV
la source
Utilisez Python:
Production
la source