Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk BEGIN比较if语句中的多个变量_Bash_Awk - Fatal编程技术网

Bash awk BEGIN比较if语句中的多个变量

Bash awk BEGIN比较if语句中的多个变量,bash,awk,Bash,Awk,我试图比较bash中使用awk BEGIN with if语句的一些float/版本号。 当我使用2个变量时,我能够进行比较并得到正确的输出。 但是在3个变量的情况下,我不能得到输出 目标: 我想要实现的是,如果输入介于两个值4.8.0和4.10.0之间,(即4.8.0),如果您支持版本排序,则可以使用以下快速机制: if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then : D

我试图比较bash中使用awk BEGIN with if语句的一些float/版本号。 当我使用2个变量时,我能够进行比较并得到正确的输出。 但是在3个变量的情况下,我不能得到输出

目标

我想要实现的是,如果输入介于两个值4.8.0和4.10.0之间,(即4.8.0),如果您支持版本排序,则可以使用以下快速机制:

if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then
    : Do something
fi
如果支持版本排序,则可以使用以下快速机制:

if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then
    : Do something
fi

问题不在于“问题不在于”浮点输入?这些看起来更像版本号真的吗?你知道
4.9.4
不是一个浮点号吗?正如@Thor所说,它们实际上是版本号。我想你应该把两个字符串分成数组,并比较数组的每个组成部分。实际上,我正在寻找一个通用的浮点和版本号解决方案。所以我的输入可以是浮点数,也可以是版本号。有了2个变量,我可以得到浮点数和版本号的输出,所以我认为用3个变量也可以。嗯,这通常会起作用吗?数字4.10<4.9,但版本4.10>4.9,对吗?浮点数输入?这些看起来更像版本numbersrely?你知道
4.9.4
不是浮点数吗?正如@Thor所说,它们实际上是版本号。我想你应该将两个字符串分成数组,并比较数组的每个组成部分。实际上,我正在寻找浮点数和版本号的通用解决方案。因此,我的输入可以是浮点数以及版本号。有了2个变量,我就可以为浮点和版本号生成输出,所以我认为用3个变量也可以。嗯,这通常有效吗?数字4.10<4.9,但版本4.10>4.9,对吗?这很适合我的需要。但我也想理解为什么上面的代码使用awkBEGIN不能处理3个变量。我的代码是否有问题,或者这是awk BEGIN的一个限制。这不是“浮点数排序”。这是版本排序。您可以在
awk
中处理相同的管道,但您需要将字段分隔为
4
8
0
inp\u 1
inp\u 2
inp\u 3
等,并比较各个字段……这很适合我的需要。但我还想了解为什么上面的代码带有wk BEGIN无法处理3个变量。我的代码是否有问题,或者这是awk BEGIN的限制。这不是“浮点数排序”。这是版本排序。您可以在
awk
中处理相同的管道,但需要将字段分隔为
4
8
0
inp\u 1
inp\u 2
inp\u 3
等,并比较各个字段。。。
if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then
    : Do something
fi
inp=4.9.0
out = $(
 awk -v nt=${inp} -v nl=4.8.0 -v nh=4.10.0 \
  '# use a function to compare dotted value 
    function lt( Arg1, Arg2) {
      # split version into elements
      S = ES1 = split( Arg1, E1, /[.]/)
      ES2 = split( Arg2, E2, /[.]/)
      # take longest serie
      if( ES1 < ES2) S = ES2
      # reinit lower and bigger flag
      l=b=0

      # test if bigger, smaller or equivalent
      for( i=1;i <= S && ! ( l || b ) ; i++) {
         if( E1[i] < E2[i] ) l++
          else if ( E1[i] > E2[i] ) b++
         }
      # return 1 if smaller
      return ( l )
      }

   # is between
   BEGIN { print ( lt(nl, nt) && lt( nt, nh)) }
   '
   )