GNU/Linux >> Linux Esercitazione >  >> Linux

Come convertire una stringa in un numero intero in UNIX

La soluzione standard:

 expr $d1 - $d2

Puoi anche fare:

echo $(( d1 - d2 ))

ma attenzione che questo tratterà 07 come un numero ottale! (quindi 07 è uguale a 7 , ma 010 è diverso da 10 ).


Ognuno di questi funzionerà dalla riga di comando della shell. bc è probabilmente la tua soluzione più semplice però.

Usando bc:

$ echo "$d1 - $d2" | bc

Usando awk :

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

Usando perl :

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

Usando Python :

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

tutti ritornano

4

Una risposta che non si limita al caso dell'OP

Il titolo della domanda porta le persone qui, quindi ho deciso di rispondere a questa domanda per tutti gli altri poiché il caso descritto dall'OP era così limitato.

TL;DR

Alla fine ho deciso di scrivere una funzione.

  1. Se vuoi 0 in caso di non-int:
int(){ printf '%d' ${1:-} 2>/dev/null || :; }
  1. Se vuoi [empty_string] in caso di non-int:
int(){ expr 0 + ${1:-} 2>/dev/null||:; }
  1. Se vuoi trova il primo int o [stringa_vuota] :
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }
  1. Se vuoi trovare il primo int o 0:
# This is a combination of numbers 1 and 2
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }

Se vuoi ottenere un codice di stato diverso da zero su non-int, rimuovi ||: (ovvero o true ) ma lascia ;

Test

# 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
)

Uscita di prova

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

Nota

Sono stato spedito in questa tana del coniglio perché la risposta accettata non è compatibile con set -o nounset (ovvero 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. Come convertire CentOS 8 in CentOS Stream

  2. Come utilizzare Sed per sostituire una stringa multilinea?

  3. Come posso convertire un puntatore di file ( FILE* fp ) in un descrittore di file (int fd)?

  4. Come eseguire il grep per la parola esatta se la stringa contiene un punto

  5. Converti una stringa di testo in bash in array

Come verificare se una stringa contiene una sottostringa in Bash

Come trovare una stringa in un file su Linux

Come convertire in batch file PDF su Linux

Come convertire xlsx in formato CSV in Linux

Come convertire un file Windows in un file UNIX

Come convertire una pagina Web in PDF in Linux