GNU/Linux >> Tutoriels Linux >  >> Linux

Comment convertir une chaîne en entier sous UNIX

La solution standard :

 expr $d1 - $d2

Vous pouvez également :

echo $(( d1 - d2 ))

mais attention cela traitera 07 sous forme de nombre octal ! (donc 07 est identique à 7 , mais 010 est différent de 10 ).


N'importe lequel d'entre eux fonctionnera à partir de la ligne de commande du shell. bc est probablement votre solution la plus simple.

Utilisation de bc :

$ echo "$d1 - $d2" | bc

Utilisation de awk :

$ echo $d1 $d2 | awk '{print $1 - $2}'

Utilisation de perl :

$ perl -E "say $d1 - $d2"

Utilisation de Python :

$ python -c "print $d1 - $d2"

tous reviennent

4

Une réponse qui ne se limite pas au cas de l'OP

Le titre de la question amène les gens ici, j'ai donc décidé de répondre à cette question pour tout le monde puisque le cas décrit par le PO était si limité.

TL;DR

J'ai finalement décidé d'écrire une fonction.

  1. Si vous voulez 0 en cas de non-entier :
int(){ printf '%d' ${1:-} 2>/dev/null || :; }
  1. Si vous voulez [empty_string] en cas de non-entier :
int(){ expr 0 + ${1:-} 2>/dev/null||:; }
  1. Si vous voulez trouver le premier int ou [empty_string] :
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }
  1. Si vous voulez trouver le premier int ou 0 :
# This is a combination of numbers 1 and 2
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }

Si vous souhaitez obtenir un code de statut non nul sur non-int, supprimez le ||: (alias ou true ) mais laissez le ;

Tests

# Wrapped in parens to call a subprocess and not `set` options in the main bash process
# In other words, you can literally copy-paste this code block into your shell to test
( set -eu;
    tests=( 4 "5" "6foo" "bar7" "foo8.9bar" "baz" " " "" )
    test(){ echo; type int; for test in "${tests[@]}"; do echo "got '$(int $test)' from '$test'"; done; echo "got '$(int)' with no argument"; }

    int(){ printf '%d' ${1:-} 2>/dev/null||:; };
    test

    int(){ expr 0 + ${1:-} 2>/dev/null||:; }
    test

    int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }
    test

    int(){ printf '%d' $(expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null)||:; }
    test

    # unexpected inconsistent results from `bc`
    int(){ bc<<<"${1:-}" 2>/dev/null||:; }
    test
)

Tester la sortie

int is a function
int ()
{
    printf '%d' ${1:-} 2> /dev/null || :
}
got '4' from '4'
got '5' from '5'
got '0' from '6foo'
got '0' from 'bar7'
got '0' from 'foo8.9bar'
got '0' from 'baz'
got '0' from ' '
got '0' from ''
got '0' with no argument

int is a function
int ()
{
    expr 0 + ${1:-} 2> /dev/null || :
}
got '4' from '4'
got '5' from '5'
got '' from '6foo'
got '' from 'bar7'
got '' from 'foo8.9bar'
got '' from 'baz'
got '' from ' '
got '' from ''
got '' with no argument

int is a function
int ()
{
    expr ${1:-} : '[^0-9]*\([0-9]*\)' 2> /dev/null || :
}
got '4' from '4'
got '5' from '5'
got '6' from '6foo'
got '7' from 'bar7'
got '8' from 'foo8.9bar'
got '' from 'baz'
got '' from ' '
got '' from ''
got '' with no argument

int is a function
int ()
{
    printf '%d' $(expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null) || :
}
got '4' from '4'
got '5' from '5'
got '6' from '6foo'
got '7' from 'bar7'
got '8' from 'foo8.9bar'
got '0' from 'baz'
got '0' from ' '
got '0' from ''
got '0' with no argument

int is a function
int ()
{
    bc <<< "${1:-}" 2> /dev/null || :
}
got '4' from '4'
got '5' from '5'
got '' from '6foo'
got '0' from 'bar7'
got '' from 'foo8.9bar'
got '0' from 'baz'
got '' from ' '
got '' from ''
got '' with no argument

Remarque

J'ai été envoyé dans ce terrier de lapin parce que la réponse acceptée n'est pas compatible avec set -o nounset (alias set -u )

# This works
$ ( number="3"; string="foo"; echo $((number)) $((string)); )
3 0

# This doesn't
$ ( set -u; number="3"; string="foo"; echo $((number)) $((string)); )
-bash: foo: unbound variable

Linux
  1. Comment remplacer une chaîne dans un ou plusieurs fichiers ?

  2. Comment convertir la sortie du shell de Linux en HTML ?

  3. Comment puis-je convertir un pointeur de fichier ( FILE* fp ) en un descripteur de fichier (int fd) ?

  4. Comment grep pour le mot exact si la chaîne contient un point

  5. Comment utiliser les variables atomiques en C ?

Comment vérifier si une chaîne contient une sous-chaîne dans Bash

Comment trouver une chaîne dans un fichier sous Linux

Comment convertir par lots des fichiers PDF sous Linux

Comment convertir xlsx au format CSV sous Linux

Comment convertir un fichier Windows en un fichier UNIX

Comment convertir une page Web en PDF sous Linux