bash中将参数字符串转换为整数


72

尝试弄清楚如何将参数转换为整数以对其进行算术运算,然后打印出来,例如addOne.sh

echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1

我尝试格式化您的问题,但仍不清楚。printf "1 + %s\n" $1 won't do ?
Archemar

Answers:


87

在bash中,不会“将参数转换为整数以执行算术”。在bash中,根据上下文,变量将被视为整数或字符串。

要执行算术运算,您应该调用算术扩展运算符$((...))。例如:

$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3

或通常首选:

$ echo "$((a + 1))"
3

您应该意识到,bash(与ksh93,zsh或yash相对)仅执行整数运算。如果您有浮点数(带小数的数字),那么还有其他工具可以帮助您。例如,使用bc

$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14

或者,您可以使用具有浮点运算支持的shell来代替bash:

zsh> echo $((3.14 + 1))
4.14

如果您不知道字符串是什么(例如用户输入),则使用$(())或(())是不安全的。考虑以下情况:foo = foo((foo + = 0))这将导致脚本崩溃,因为它尝试递归评估foo。与:foo = foo foo = $((foo + 0))
艺术

12

其他方式,您可以使用 expr

例如:

$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3

10

在中bash,您可以使用printf -v执行从任何内容到整数的转换:

printf -v int '%d\n' "$1" 2>/dev/null

浮点数将被转换为整数,而任何看起来都不像数字将被转换为0。幂运算将被截断为之前的数字 e

例:

$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1

2
在没有其他外壳的情况下,printf -v可以通过命令替换来实现:int="$(printf '%d' 123.123 2>/dev/null)"
AdrianGünter18年

2
这在bash中不起作用。
Michael Martinez

您确定@MichaelMartinez吗?bash您使用的是什么版本?
cuonglm

GNU bash版本4.2.46(1)-发行版(x86_64-redhat-linux-gnu)
Michael Martinez

5

最近开发用于在Linux和OSX环境中运行的bash脚本时出现了类似情况。OSX中一个命令的结果返回一个包含结果代码的字符串。即" 0"。当然,在以下情况下无法正确测试:

if [[ $targetCnt != 0 ]]; then...

解决方案是将结果强制(即“转换”)为整数,类似于上面的@ John1024回答,以便按预期方式工作:

targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...

3
==[[(也[称为test)中进行字符串比较。算术比较有不同的运算符[[ $targetcnt -ne 0 ]] ; 请参见条件表达式下的联机帮助页(或信息)。要专门修剪空格,可以使用不[带引号的变量扩展[ $targetcnt == 0 ]来获取默认的单词拆分(未在中完成[[),但通常这种方法会导致您陷入危险。
dave_thompson_085 '16

-2

关心颜色代码,即使-x它们不会出现在迹线()中,也可以消除它的原因是,无论您如何打印,应该是数字的字符串都用引号引起来。


1
投票否决,因为我发现您的答案不清楚。也许您可以添加该脚本应更正的内容?
Time4Tea

这是搜索bash + integer + string的最佳答案,因此我添加了一条与之相关的信息,答案中没有包含这条信息,也就是说,当字符串用颜色代码包装时,可能不清楚为什么诸如$((var+var))失败之类的操作会失败但是,如果您echoprintf两个变量都相同。我不知道此修复程序,因为我只能通过在输出源处禁用颜色代码来修复它。要在跟踪日志中发现它,您将看到分配的有问题的变量,var='0'尽管它应该只是var=0
直到

您可以做的是确保输出中没有颜色代码(sed如果您不能禁用它)
撤消
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.