【问题标题】:How to store big values in shell script variable如何在shell脚本变量中存储大值
【发布时间】:2015-08-10 12:28:26
【问题描述】:

当我在变量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

所以仍然打印值 -ve :(,使用 expr 也会给出如下奇怪的结果

# b=`expr $(blockdev --getsize64 /dev/mmcblk0) - 17408`
# echo $b
2147466239

实际问题的答案
所以最初的问题是由 agilob 回答的,所以我接受了这个答案。我可以解决的实际问题如下,

# b=$(blockdev --getsize64 /dev/mmcblk0)
# echo $b
3841982464
# echo "$b 17408 - p" | dc
3841965056

AWK方式

我尝试按照user1934428的建议以awk方式进行,可以如下进行,

# echo "$(blockdev --getsize64 /dev/mmcblk0) 17408" | awk '{ printf "%.0f", $1 - $2}'
3841965056#

【问题讨论】:

    标签: bash shell busybox ash


    【解决方案1】:

    为什么不只是:

    b=3841982464
    echo $b
       => 3841982464
    

    【讨论】:

    • 天哪,我认为它与let b=3841982464 相同。谢谢你。顺便说一句有什么区别?
    • 好的,以上解决方案有效。但是如果我按如下方式使用它`b=$(($(blockdev --getsize64 /dev/mmcblk0) - $((17*1024))))`它会打印# echo $b-453002240,你建议使用表达式?
    • let 计算表达式,让 a=1-1;回声$a;将打印 0。如果您不介意,请接受答案;)
    • 实际上我想评估表达式,同时我不想折叠值。
    • 我现在在 windows 上,当我在家里用 linux 时我会帮你解决这个问题,尝试将 $(( 更改为其他 cmd 执行器,如 `` 或 eval(?)
    【解决方案2】:

    您基本上想用“任意长整数”进行算术运算。这不是 bash 内置的(它使用 8 字节整数)。

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

    【讨论】:

    • 感谢@user1934428 的回复,我的板上没有红宝石。我可以用dc解决它
    • 这只是一个例子。有很多选择。我可能不会使用 dc / bc 执行此操作的原因是,具有此类数字要求的脚本有时更容易解决,当它们完全用与 shell 不同的语言实现时。我偶尔会从一个 shell 脚本开始,使用 Ruby 或 Perl 或 Awk 来解决简单的子任务,随着时间的推移,我从脚本中提取出越来越多的功能并将其用于选择的编程语言;-)
    • 我同意你关于将脚本迁移到编程语言是更好的想法。只是出于好奇,您是否将脚本的小功能转移到小程序中?那你会混合使用它们吗?
    • 我确实将它们混合在一起,因为我喜欢使用最适合手头数据的工具。但是,我只有在任务可以清楚地分开时才混合它们,因为否则来回传递信息可能会很痛苦。大多数时候,我有一个在 Z-Shell 中经常使用的通用驱动程序,然后它会调用用其他语言编写的子任务程序。一旦我在 Perl 或 Ruby 中,我很少会觉得调用 shell 脚本来执行子任务的诱惑,除非这个子任务可以被视为独立的、普遍有用的工具。
    • 我也是用 awk 方式做的,这对其他人来说看起来也很熟悉和可读,如果他们看我的脚本,我会使用它。
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多