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;博士
我最终决定写一个函数
0
:int()
int(){expr 0+${1:-}2>/dev/null | |:;}
int()
#这是数字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;