【问题标题】:Subtracting using Bash使用 Bash 进行减法
【发布时间】:2021-10-26 17:57:05
【问题描述】:

我正在尝试使用 bash 从十进制数中减去。

例如: 如果我有一个数字 1.0.0.55,我想减去得到 1.0.0.54。

这是我目前拥有的:

#!/bin/bash

LATEST_RELEASE="myproduct_1.0.0.55"

RELEASE_NUMBER=`echo $LATEST_RELEASE | sed 's/[^0-9.]//g'`

echo $RELEASE_NUMBER

#this only works with whole numbers (i.e. 10055)
PREVIOUS_RELEASE=$(($RELEASE_NUMBER - 1))

echo $PREVIOUS_RELEASE

#EOF

任何帮助将不胜感激!

谢谢!

【问题讨论】:

  • 原始字符串1.0.0.0应该输出什么?
  • 好问题!在这种情况下我不需要那个。我检查了以前的版本号,如果它不存在,我检查文件本身的日期,以确保它比当前文件更旧。

标签: string bash shell


【解决方案1】:

您需要隔离要从中提取1 的字符串部分,因为您无法从字符串1.0.0.55 中子跟踪1

考虑在这里使用 awk:

echo '1.0.0.55' | awk 'BEGIN{FS=OFS="."}{$4=$4-1}1'

【讨论】:

  • 最好使用{$NF=$NF-1}{$NF-=1}
  • 总计:echo 1.0.0.55 | awk '{$NF-=1}1' FS=. OFS=.
  • 好的,这很好用。我了解字段分隔符部分,但我有一个关于字段数部分的快速问题。对于 '{$NF-=1}1' ,第二个 1 是做什么用的?我可以输入 '{$NF-=1}9' 并返回相同的结果。只是好奇。
  • @Stacker 花括号后面的第二个1 只是awk 中的简写。可以这样写:'{$NF-=1}{print $0},但由于打印整行是默认行为,您只需传递“true”条件或1,它就会导致 awk 打印。我们在 awk 中玩了很多代码高尔夫,因为它经常用于像这样的单行代码。
【解决方案2】:

"myproduct_1.0.0.54" 不是数字,所以我们不能轻易地从中减去 1。


我会使用Parameter-Expansion (${parameter:-word}) 来获取最后一个. 之后的部分,并在数字上使用它,以便我们可以+ 1

然后获取最后一个点之前的所有内容以再次连接字符串:

#!/bin/bash

input="myproduct_1.0.0.55"
minus=$((${input##*.} - 1))

echo "${input%.*}.${minus}"

将产生:

myproduct_1.0.0.54

Try it online!

【讨论】:

    【解决方案3】:

    使用bash 及其Parameter Expansion

    latest_release="myproduct_1.0.0.55"
    
    first="${latest_release%.*}"
    
    declare -i last                     # set integer flag
    last="${latest_release##*.}"-1
    
    previous_release="$first.$last"
    echo "$previous_release"
    

    输出:

    myproduct_1.0.0.54

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多