GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana mengkonversi string ke integer di UNIX

Solusi standar:

 expr $d1 - $d2

Anda juga dapat melakukan:

echo $(( d1 - d2 ))

tetapi berhati-hatilah karena ini akan memperlakukan 07 sebagai bilangan oktal! (jadi 07 sama dengan 7 , tapi 010 berbeda dengan 10 ).


Semua ini akan bekerja dari baris perintah shell. bc mungkin adalah solusi Anda yang paling mudah.

Menggunakan bc:

$ echo "$d1 - $d2" | bc

Menggunakan awk :

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

Menggunakan perl :

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

Menggunakan Python :

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

semua kembali

4

Jawaban yang tidak terbatas pada kasus OP

Judul pertanyaan mengarahkan orang ke sini, jadi saya memutuskan untuk menjawab pertanyaan itu untuk semua orang karena kasus yang dijelaskan OP sangat terbatas.

TL;DR

Saya akhirnya memutuskan untuk menulis sebuah fungsi.

  1. Jika Anda ingin 0 dalam kasus non-int:
int(){ printf '%d' ${1:-} 2>/dev/null || :; }
  1. Jika Anda ingin [string_kosong] dalam kasus non-int:
int(){ expr 0 + ${1:-} 2>/dev/null||:; }
  1. Jika Anda ingin menemukan int pertama atau [string_kosong] :
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }
  1. Jika Anda ingin menemukan int pertama atau 0:
# This is a combination of numbers 1 and 2
int(){ expr ${1:-} : '[^0-9]*\([0-9]*\)' 2>/dev/null||:; }

Jika Anda ingin mendapatkan kode status bukan nol pada non-int, hapus kode ||: (alias atau true ) tetapi tinggalkan ;

Pengujian

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

Hasil uji

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

Catatan

Saya dikirim ke lubang kelinci ini karena jawaban yang diterima tidak sesuai dengan 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. Bagaimana Mengonversi CentOS 8 ke CentOS Stream

  2. Bagaimana Cara Mengganti String Dalam File?

  3. Bagaimana Cara Menggunakan Sed Untuk Mengganti String Multi-baris?

  1. Cara Memisahkan String dalam Skrip Bash

  2. Bagaimana cara mengubah output shell Linux ke HTML?

  3. Cara mengonversi DATE ke UNIX TIMESTAMP dalam skrip shell di MacOS

  1. Ubah output menjadi string

  2. Konversikan string teks dalam bash ke array

  3. Bagaimana mengkonversi PDF ke Grayscale