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

Linux 如何在UNIX中将字符串转换为整数,linux,shell,unix,interactive,Linux,Shell,Unix,Interactive,我有d1=“11”和d2=“07”。我想将d1和d2转换为整数并执行d1-d2。在UNIX中如何执行此操作 d1-d2当前为我返回“11-07”作为结果。使用以下方法: #include <stdlib.h> #include <string.h> int main() { const char *d1 = "11"; int d1int = atoi(d1); printf("d1 = %d\n", d1); return 0; }

我有
d1=“11”
d2=“07”
。我想将
d1
d2
转换为整数并执行
d1-d2
。在UNIX中如何执行此操作

d1-d2
当前为我返回
“11-07”
作为结果。

使用以下方法:

#include <stdlib.h>
#include <string.h>

int main()
{
    const char *d1 = "11";
    int d1int = atoi(d1);
    printf("d1 = %d\n", d1);
    return 0;
}
#包括
#包括
int main()
{
常量字符*d1=“11”;
int d1int=atoi(d1);
printf(“d1=%d\n”,d1);
返回0;
}

等等。

其中任何一个都可以从shell命令行工作<代码>bc可能是最直接的解决方案

使用:

使用
awk

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

$ perl -E "say $d1 - $d2"
使用
Python

$ python -c "print $d1 - $d2"
全部返回

4
标准溶液:

 expr $d1 - $d2
您还可以执行以下操作:

echo $(( d1 - d2 ))
但请注意,这会将
07
视为一个八进制数!(因此
07
7
相同,但
010
10
不同)

这应该会有所帮助。

答案不限于OP的情况 这个问题的标题将人们引向这里,所以我决定为其他人回答这个问题,因为OP描述的案例非常有限

TL;博士 我最终决定写一个函数

  • 如果在非int的情况下希望
    0
  • int()
    
  • 如果在非int的情况下需要[empty_string]:
  • int(){expr 0+${1:-}2>/dev/null | |:;}
    
  • 如果要查找第一个int或[empty_string]:
  • int()
    
  • 如果要查找第一个int或0:
  • #这是数字1和2的组合
    int(){expr${1:-}:'[^0-9]*\([0-9]*\)'2>/dev/null | |:;}
    
    如果要在非int上获取非零状态代码,请删除
    | |:
    (aka或
    true
    ),但保留

    测验
    #包装在parens中以调用子进程,而不是主bash进程中的“set”选项
    #换句话说,您可以将这个代码块复制粘贴到shell中进行测试
    (set-欧盟;
    测试=(4“5”6foo“bar7”foo8.9bar“baz”)
    test(){echo;键入int;用于“${tests[@]}”中的测试;do echo“got'$(int$test)'from'$test';done;echo“got'$(int)'不带参数”;}
    int(){printf'%d'${1:-}2>/dev/null | |:;};
    测试
    int(){expr 0+${1:-}2>/dev/null | |:;}
    测试
    int(){expr${1:-}:'[^0-9]*\([0-9]*\)'2>/dev/null | |:;}
    测试
    int(){printf'%d'$(expr${1:-}:'[^0-9]*\([0-9]*\)'2>/dev/null)|:;}
    测试
    #来自`bc的意外不一致结果`
    int(){bc/dev/null | |:
    }
    从“4”中获得“4”
    从“5”中获得“5”
    从“6foo”中获取“”
    从“bar7”中获取“”
    从“foo8.9bar”中获取“”
    从“baz”中得到了“baz”
    从“”中获取“”
    从“”中获取“”
    没有参数就得到了“”
    int是一个函数
    int()
    {
    expr${1:-}:'[^0-9]*\([0-9]*\)'2>/dev/null | |:
    }
    从“4”中获得“4”
    从“5”中获得“5”
    从“6foo”获得“6”
    从“bar7”中获得“7”
    从“foo8.9bar”中获得“8”
    从“baz”中得到了“baz”
    从“”中获取“”
    从“”中获取“”
    没有参数就得到了“”
    int是一个函数
    int()
    {
    printf“%d”$(expr${1:-}:'[^0-9]*\([0-9]*\)'2>/dev/null)|
    }
    从“4”中获得“4”
    从“5”中获得“5”
    从“6foo”获得“6”
    从“bar7”中获得“7”
    从“foo8.9bar”中获得“8”
    已从“baz”获取“0”
    已从“”获取“0”
    已从“”获取“0”
    获取了没有参数的“0”
    int是一个函数
    int()
    {
    
    bc您是想从命令行还是通过编程实现这一点?不确定这是错误还是
    expr
    awk
    bc
    、和
    dc
    ,但所有这些工具都通过将09视为十进制值9来处理这一情况。然而,
    perl
    python
    将其视为语法错误ror.对于
    d1=010
    @williampersell这个案例,你会得到不同的结果,这很有趣。我必须研究一下这个有用的信息,谢谢。你可以直接用纯Bash来做:
    echo$((d1-10#$d2))
    qwarentine意味着Linux shell。既然Bash有指定数字基的语法,为什么不在这里演示它呢(尽管有可移植性警告)?您可以进行基本转换:
    echo$((d1-10#$d2))
    注意:它与
    echo$((d1-10#d2))不同
    考虑到bash不是标准,也不是所有目标都能保证……跳过bash ISM怎么样,因为他们没有询问如何在bash中实现它……?如果变量可以包含非整数字符串,或者如果您使用的是选项
    nounset
    errexit
    (您应该始终使用这些选项),请小心。在我的回答中,我已经为不同的场景编写了许多测试。你一定要小心非整数值,使用
    nounset
    通常是个好主意。但是你永远不应该使用
    errexit
    。这实际上与公认答案中的
    d=$(d1-d2));echo“$d”
    相同(与
    0
    -前缀数字被解释为八进制相同)。
    echo $(( d1 - d2 ))
    
    let d=d1-d2;echo $d;