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

use*_*986 125 bash

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

echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 143

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

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

$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3
Run Code Online (Sandbox Code Playgroud)

或一般首选:

$ echo "$((a + 1))"
3
Run Code Online (Sandbox Code Playgroud)

您应该知道 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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用具有浮点算术支持的 shell 而不是 bash:

zsh> echo $((3.14 + 1))
4.14
Run Code Online (Sandbox Code Playgroud)

  • 如果您不知道字符串是什么(如用户输入),则使用 $(( )) 或 (( )) 是不安全的。考虑一下: foo=foo (( foo += 0 )) 这将导致脚本崩溃,因为它试图递归地计算 foo。同: foo=foo foo=$(( foo + 0 )) (2认同)

小智 22

其他方式,您可以使用 expr

前任:

$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 14

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

printf -v int '%d\n' "$1" 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

浮点数会被转换成整数,而任何看起来不像数字的东西都会被转换成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
Run Code Online (Sandbox Code Playgroud)

  • 在其他没有 `printf -v` 的 shell 中,这可以通过命令替换来实现:`int="$(printf '%d' 123.123 2>/dev/null)"` (3认同)
  • 回复:“浮点数将转换为整数”,传递除 `int` 之外的任何内容都是未定义的(这就是为什么需要将错误消息重定向到 stderr,即使它似乎在小数点处截断),因此,只需将格式设置为带有零位小数的浮点数,例如“printf '%.0f' 123.123”会生成“123”,而不会出现任何错误消息。(显然也适用于整数参数。) (2认同)

JES*_*Sii 13

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

if [[ $targetCnt != 0 ]]; then...
Run Code Online (Sandbox Code Playgroud)

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

targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
Run Code Online (Sandbox Code Playgroud)

  • `[[`(也称为 `[` 又名 `test`)中的 `==` 等进行字符串比较。有**不同的运算符**用于算术比较,例如`[[ $targetcnt -ne 0 ]]`; 请参阅条件表达式下的联机帮助页(或信息)。要特别修剪空格,您可以使用带有不带引号的变量扩展“[ $targetcnt == 0 ]” 的 `[` 来获得默认分词(在 `[[` 中未完成),但通常这种方法会使您陷入危险。 (4认同)