web-dev-qa-db-fra.com

Chaîne d'argument en entier dans bash

Essayer de comprendre comment convertir un argument en un entier pour effectuer l'arithmétique, puis l'imprimer, par exemple pour addOne.sh:

echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
89
user135986

En bash, on ne "convertit pas un argument en un entier pour effectuer l'arithmétique". En bash, les variables sont traitées comme un entier ou une chaîne selon le contexte.

Pour effectuer l'arithmétique, vous devez appeler l'opérateur d'expansion arithmétique $((...)). Par exemple:

$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3

ou généralement préféré:

$ echo "$((a + 1))"
3

Vous devez savoir que bash (par opposition à ksh93, zsh ou yash) exécute uniquement l'arithmétique entier. Si vous avez des nombres à virgule flottante (nombres avec décimales), il existe d'autres outils pour vous aider. Par exemple, utilisez bc:

$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14

Ou vous pouvez utiliser un Shell avec un support arithmétique à virgule flottante au lieu de bash:

zsh> echo $((3.14 + 1))
4.14
104
John1024

Sinon, vous pouvez utiliser expr

Ex:

$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3
17
Nam

Dans bash, vous pouvez effectuer la conversion de n'importe quoi en entier en utilisant printf -v :

printf -v int '%d\n' "$1" 2>/dev/null

Le nombre flottant sera converti en entier, tandis que tout ce qui ne ressemble pas à un nombre sera converti en 0. L'exponentiation sera tronquée au nombre avant e

Exemple:

$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1
11
cuonglm

Une situation similaire s'est produite récemment lors du développement de scripts bash à exécuter dans les environnements Linux et OSX. Le résultat d'une commande dans OSX a renvoyé une chaîne contenant le code de résultat; c'est à dire., " 0". Bien sûr, cela n'a pas réussi à tester correctement dans le cas suivant:

if [[ $targetCnt != 0 ]]; then...

La solution était de forcer (c'est-à-dire `` convertir '') le résultat en un entier, similaire à ce que @ John1024 a répondu ci-dessus afin qu'il fonctionne comme prévu:

targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
9
JESii