Bash 如何在shell脚本变量中存储大值

Bash 如何在shell脚本变量中存储大值,bash,shell,busybox,ash,Bash,Shell,Busybox,Ash,当我在变量busybox shell脚本中存储大值并打印时,它会打印-ve值。 我知道shell没有变量类型,但如何避免将值折叠回-ve呢? 我在shell中使用了下面的命令,它会打印-ve值 # let b=3841982464 # echo $b -452984832 有什么建议/建议吗 编辑: agilob建议的答案适用于我的原始问题,但我的实际问题是,我是最后一个到达磁盘末尾的人-17kb,所以我使用如下命令 # b=$(($(blockdev --getsize64 /dev/mmc

当我在变量busybox shell脚本中存储大值并打印时,它会打印-ve值。 我知道shell没有变量类型,但如何避免将值折叠回-ve呢? 我在shell中使用了下面的命令,它会打印-ve值

# let b=3841982464
# echo $b
-452984832
有什么建议/建议吗

编辑: agilob建议的答案适用于我的原始问题,但我的实际问题是,我是最后一个到达磁盘末尾的人-17kb,所以我使用如下命令

# b=$(($(blockdev --getsize64 /dev/mmcblk0) - $((17*1024))))
# echo $b
-453002240
# b=`expr $(blockdev --getsize64 /dev/mmcblk0) - 17408`
# echo $b
2147466239
所以静态值是printed-ve:,使用expr也会得到如下奇怪的结果

# b=$(($(blockdev --getsize64 /dev/mmcblk0) - $((17*1024))))
# echo $b
-453002240
# b=`expr $(blockdev --getsize64 /dev/mmcblk0) - 17408`
# echo $b
2147466239
实际问题的答案 原来的问题是阿吉洛布回答的,所以我接受了这个答案。我可以解决的实际问题如下:

# b=$(blockdev --getsize64 /dev/mmcblk0)
# echo $b
3841982464
# echo "$b 17408 - p" | dc
3841965056
# echo "$(blockdev --getsize64 /dev/mmcblk0) 17408" | awk '{ printf "%.0f", $1 - $2}'
3841965056#
AWK方式

我试着按照user1934428的建议用awk的方式来做,它可以按如下方式来做

# b=$(blockdev --getsize64 /dev/mmcblk0)
# echo $b
3841982464
# echo "$b 17408 - p" | dc
3841965056
# echo "$(blockdev --getsize64 /dev/mmcblk0) 17408" | awk '{ printf "%.0f", $1 - $2}'
3841965056#
为什么不只是:

b=3841982464
echo $b
   => 3841982464
为什么不只是:

b=3841982464
echo $b
   => 3841982464

基本上,您需要对任意长整数进行算术运算。这不是内置于使用8字节整数的bash中的


我会将这些数字存储在普通的环境变量中,并使用其他编程语言(例如Ruby)来处理它们。

基本上,您需要对任意长整数进行算术运算。这不是内置于使用8字节整数的bash中的


我会将数字存储在普通的环境变量中,并使用其他编程语言(例如Ruby)来处理它们。

Omg我认为这与let b=3841982464是一样的。非常感谢。顺便说一句,有什么区别?好的,上面的解决方案有效。但如果我按如下方式使用它`b=$$blockdev-getsize64/dev/mmcblk0-$17*1024`它打印echo$b-453002240,你建议使用expr吗?让我们计算表达式,让a=1-1;echo$a;将打印0。如果你不介意,请接受答案;事实上,我想计算表达式,同时我不想折叠值。我现在在windows上,我会在linux上帮助你,尝试将$更改为其他cmd执行器,如``或evalOmg,我认为它与let b=3841982464相同。非常感谢。顺便说一句,有什么区别?好的,上面的解决方案有效。但如果我按如下方式使用它`b=$$blockdev-getsize64/dev/mmcblk0-$17*1024`它打印echo$b-453002240,你建议使用expr吗?让我们计算表达式,让a=1-1;echo$a;将打印0。如果你不介意,请接受答案;实际上,我想计算表达式,同时我不想折叠值。我现在在windows上,我在linux上的时候会帮你,尝试将$更改为其他cmd执行器,如``或evalThank you for reply@user1934428,我的板上没有ruby。我可以用DCT解决它,这只是一个例子。有很多选择。我之所以可能不使用dc/bc,是因为具有此类数字需求的脚本有时更容易解决,因为它们完全是用与shell不同的语言实现的。我偶尔从一个shell脚本开始,使用Ruby、Perl或Awk来解决简单的子任务,随着时间的推移,我从脚本中提取越来越多的功能,并将其转换为所选择的编程语言-我同意你的观点,将脚本转移到编程语言是更好的主意。出于好奇,您是否将脚本的小功能移动到小程序中?那么,你会将两者混合使用吗?我会混合使用,因为我喜欢使用最适合手头数据的工具。但是,只有当任务可以清楚地分开时,我才会将它们混合在一起,因为否则来回传递信息会很痛苦。大多数情况下,我有一个常用于Z-Shell的通用驱动程序,它调用其他语言编写的子任务程序。一旦我进入Perl或Ruby,我很少会想调用shell脚本来执行子任务,除非这个子任务可以被视为独立的、通常有用的工具。我也是以awk的方式完成的,如果其他人看我的脚本,他们看起来也很熟悉和可读,谢谢你回复@user1934428,我的黑板上没有ruby。我可以用DCT解决它,这只是一个例子。有很多选择。我之所以可能不使用dc/bc,是因为具有此类数字需求的脚本有时更容易解决,因为它们完全是用与shell不同的语言实现的。我偶尔从一个shell脚本开始,使用Ruby、Perl或Awk来解决简单的子任务,随着时间的推移,我从脚本中提取越来越多的功能,并将其转换为所选择的编程语言-我同意你的观点,将脚本转移到编程语言是更好的主意。出于好奇,您是否将脚本的小功能移动到小程序中?那么,你会将两者混合使用吗?我会混合使用,因为我喜欢使用最适合手头数据的工具。但是,只有当任务可以清楚地分开时,我才会将它们混合在一起,因为否则来回传递信息会很痛苦。大多数时候,我有一个通用电气
通常在Z-Shell中使用的通用驱动程序,然后调用其他语言编写的子任务程序。一旦我进入Perl或Ruby,我很少感觉到调用shell脚本来执行子任务的诱惑,除非这个子任务可以被视为独立的、通常有用的工具。我也是以awk的方式完成的,其他人看起来也非常熟悉和可读,如果他们看我的脚本,我将使用它。