GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo convertir cadena a entero en UNIX

La solución estándar:

 expr $d1 - $d2

También puedes hacer:

echo $(( d1 - d2 ))

pero tenga en cuenta que esto tratará 07 como un número octal! (entonces 07 es lo mismo que 7 , pero 010 es diferente a 10 ).


Cualquiera de estos funcionará desde la línea de comando de shell. bc Sin embargo, es probablemente la solución más sencilla.

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"

todos regresan

4

Una respuesta que no se limita al caso del OP

El título de la pregunta lleva a las personas aquí, así que decidí responder esa pregunta para todos los demás, ya que el caso descrito del OP era muy limitado.

TL;DR

Finalmente me decidí por escribir una función.

  1. Si quieres 0 en caso de no int:
int(){ printf '%d' ${1:-} 2>/dev/null || :; }
  1. Si quieres [empty_string] en caso de no int:
int(){ expr 0 + ${1:-} 2>/dev/null||:; }
  1. Si desea encontrar el primer int o [empty_string] :
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }
  1. Si desea encontrar el primer int o 0:
# This is a combination of numbers 1 and 2
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }

Si desea obtener un código de estado distinto de cero en non-int, elimine el ||: (también conocido como true ) pero deja el ;

Pruebas

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

Salida de prueba

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

Me enviaron a este agujero de conejo porque la respuesta aceptada no es compatible con set -o nounset (también conocido como 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. Cómo convertir CentOS 8 a CentOS Stream

  2. ¿Cómo convertir la salida de shell de Linux a HTML?

  3. Cómo convertir DATE a UNIX TIMESTAMP en script de shell en MacOS

  4. Cómo buscar la palabra exacta si la cadena tiene un punto

  5. ¿Cómo usar variables atómicas en C?

Cómo verificar si una cadena contiene una subcadena en Bash

Cómo encontrar una cadena en un archivo en Linux

Cómo convertir por lotes archivos PDF en Linux

Cómo convertir xlsx a formato CSV en Linux

Cómo convertir un archivo de Windows a un archivo UNIX

Cómo convertir una página web a PDF en Linux