试图弄清楚如何将参数转换为整数以执行算术运算,然后将其打印出来,例如 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)
小智 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)
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)