如何在UNIX shell中将字符串转换为整数

hgqdbh6s  于 2022-11-04  发布在  Unix
关注(0)|答案(5)|浏览(293)

我有d1="11"d2="07"。我想将d1d2转换为整数,并执行d1-d2。在UNIX中如何执行此操作?
d1 - d2当前返回"11-07"作为我结果

nwlls2ji

nwlls2ji1#

标准品溶液:

expr $d1 - $d2

您还可以执行以下操作:

echo $(( d1 - d2 ))

但请注意,这会将07视为一个八进制数!(因此077相同,但01010不同)。

ioekq8ef

ioekq8ef2#

其中任何一个都可以从shell命令行运行。bc可能是最直接的解决方案。
使用bc

$ echo "$d1 - $d2" | bc

使用awk

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

使用perl

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

使用Python

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

全部返回

4
ukxgm1gy

ukxgm1gy3#

一个不局限于OP案例的答案

这个问题的标题把人们引到了这里,所以我决定为其他人回答这个问题,因为OP描述的情况是如此有限。

TL;DR

我最终决定写一个函数。
1.如果要在非int的情况下使用0

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

1.如果要在非int的情况下使用 [empty_string]

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

1.如果要查找第一个int或 [empty_string]

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

1.如果要查找第一个int或0:


# This is a combination of numbers 1 and 2

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

如果要在非int上获得非零状态代码,请删除||:(也称为true),但保留;

测试


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

测试输出

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

注意事项
我被送进了这个兔子洞,因为accepted answerset -o nounset(又名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
yhived7q

yhived7q4#

let d=d1-d2;echo $d;

这应该有帮助。

envsm3lx

envsm3lx5#

使用此选项:


# include <stdlib.h>

# include <string.h>

int main()
{
    const char *d1 = "11";
    int d1int = atoi(d1);
    printf("d1 = %d\n", d1);
    return 0;
}

等等。

相关问题