【问题标题】:Is number X three times bigger than Y in shell外壳中的数字 X 是 Y 的三倍吗
【发布时间】:2015-03-24 14:47:54
【问题描述】:

有人告诉我,在 shell 中,不使用 expr 就可以检查数字 X 是否是 Y 的三倍。想了几天,实在想不出什么办法。

有人有吗? 谢谢你的帮助。

编辑:出于好奇,是否也可以使用正则表达式检查数字是否是另一个数字的倍数?

【问题讨论】:

  • 您可以使用bc,或者如果使用BASH,则使用((...))
  • 哪个外壳?有些功能比其他功能多得多...
  • 你为什么要使用正则表达式来解决这样的问题?
  • 正则表达式匹配字符串。他们不做数学。
  • @IanMcLaird:实际上您可以使用正则表达式检查数字的可分性。当然,这当然不意味着你应该,恰恰相反:-)

标签: regex shell unix


【解决方案1】:

如果两个数字都以“基数 1”表示,那么使用正则表达式检查一个数字是否是另一个数字的倍数是微不足道的。

x=11111    # 5
y=111111111111111  # 15

# Using bash's regular expression operator for clarity
if [[ $y =~ ($x)* ]]; then
    echo "y is a multiple of x"
fi

几乎可以肯定你没有你的数字是以 1 为底的,无论如何它是一种低效的表示,所以你最好使用实际的数学。使用 POSIX 算法:

x=5
y=15
z=$((y/x))

if [ $((z * x)) -eq "$y" ]; then
    echo "$y is a multiple of $x"
fi

由于 POSIX 不支持浮点运算,您可以通过验证商 z 乘以除数 x 等于被除数 y 来检查可除性,这意味着没有余数了从部门过来。

【讨论】:

  • 可以折叠算术:if (( (y/x*x) == y )); then ...
  • 这个问题没有被标记为bash,所以我坚持使用符合 POSIX 的代码。如果((...)) 可用,那就更干净了。
  • 啊,不错。我没有意识到 POSIX 有 $(( )) 但没有 (( ))
【解决方案2】:

我可以在 bourne shell 中想到的两种方法,以及 John Kugelman 建议的另一种用于 Bash 的方法:

$ cat test
#!/bin/bash

# For all bourne shells    
[ $(echo "3*$2" | bc) -eq $1 ] && echo $1 is three times bigger than $2
[ $((3*$2)) -eq $1 ]           && echo $1 is three times bigger than $2

# Only for bash
((3*$2 == $1))                 && echo $1 is three times bigger than $2

$ sh ./test 10 30
$ sh ./test 30 10
30 is three times bigger than 10
30 is three times bigger than 10
30 is three times bigger than 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多