首页 > 解决方案 > 比较命令 bash 的数值输出

问题描述

我正在运行一个脚本,该脚本会影响文件中的参数值:

在脚本执行之前:

$猫文件

修订1.2日期:2018/11/15 09:28:12;作者:根;状态:经验​​;线路:+1 -1

运行脚本后:

$猫文件

1.3修订日期:2018/11/15 09:28:12;作者:根;状态:经验​​;行:+1 -1 修订 1.2 日期:2018/11/15 09:28:12;作者:根;状态:经验​​;线路:+1 -1

我需要一个脚本来检查版本是否被更新/碰撞为比以前版本大的一个版本,如果是,它应该将消息回显为“脚本运行成功”。

$grep -iw 'revision' file  | head -1 | cut -d' ' -f2

1.2

$sh <script>

$grep -iw 'revision' file  | head -1 | cut -d' ' -f2

1.3

$echo -e "Script ran successfully!!! \n"

标签: linuxbashshell

解决方案


这是一个碰撞函数,它将与版本字符串进行比较并确定它们是否连续。我在比较中做了几个假设。“小数点”的数量必须相同。我也为大错误敞开了大门,请参阅我的最后一个测试用例。考虑一下这又快又脏。编写逻辑来比较每个十进制值并确保最后一个小数位比前一个小数位可能会更好。一个更正确的版本将能够通过首先比较 a == d,然后是 b == c,然后是 f == c + 1 来比较 abc 和 def。但是,根据您要执行的操作,快速和肮脏可能成为最容易维护的。

没有任何额外的讨论,这里是快速和肮脏的版本:

function bumped() {
  prev=$1
  next=$2

  PREV=$( sed 's/[^0-9]//g' <<<"$prev" ) 
  NEXT=$( sed 's/[^0-9]//g' <<<"$next" ) 

  [ $(( NEXT - PREV )) -eq 1 ]

}

function testcases() { 
cat <<EOF
1.2 1.3 0
1.3 1.2 1
1.2.1 1.2.2 0
1.3   1.3.1 1
EOF
}

testcases | while
  read prev next expected extra
do
  bumped $prev $next
  observed=$?
  result="Success"
  [ $observed -ne $expected ] && result="Failed"
  echo "$result: bumped( $prev , $next ) = $observed ( expected: $expected )"
done

上述程序产生以下结果:

Success: bumped( 1.2 , 1.3 ) = 0 ( expected: 0 )
Success: bumped( 1.3 , 1.2 ) = 1 ( expected: 1 )
Success: bumped( 1.2.1 , 1.2.2 ) = 0 ( expected: 0 )
Success: bumped( 1.3 , 1.3.1 ) = 1 ( expected: 1 )
Failed: bumped( 1.3.1.1 , 13.1.2 ) = 0 ( expected: 1 )

很明显,这不是一个最佳解决方案,但它可能会让你到达你需要去的地方。如果您一直在寻找正确的东西,请考虑上面讨论的逻辑。


推荐阅读