Bash脚本:使用if和-o并仅打印真正的评估

时间:2014-05-07 13:43:09

标签: bash

我正在使用bash编写基本检查脚本。它是在java环境中,我从环境中提取xmx,xss和xms值,然后将它们与预定义的标准进行比较。这是一个非常简化的版本:

xmxstd=1024
xmsstd=512
xssstd=256

xmxval=756
xmsval=512
xssval=128

if [ $xmsstd > $xms_val -o $xssstd > $xss_val -o $xssstd > $xss_val ]; then
    echo "<OFFENDING VALUE>"
fi

我不知道在bash中是否可能这样做,但我只想在上述声明中回应出任何评估结果。也许我错过了一些愚蠢的东西,但我已经到处都找不到任何东西,我不想最终用三种不同的方式写出来,除非我不得不这样做。

4 个答案:

答案 0 :(得分:3)

[ ]测试的全部内容只有truefalse,没有办法在不重新分割的情况下探测各个元素。

你说你不想使用if,那么这个怎么样:

#!/bin/bash

xmxstd=1024
xmsstd=512
xssstd=256

xmxval=756
xmsval=512
xssval=128

(( xmxstd > xmxval )) && echo "xmx: $xmxval"
(( xmsstd > xmsval )) && echo "xms: $xmsval"
(( xssstd > xssval )) && echo "xss: $xssval"

编辑:某些关联数组怎么样?这只适用于bash版本&gt; = 4.0但我认为我会试一试:

#!/bin/bash

declare -A std
declare -A val
std=( [xmx]=1024 [xms]=512 [xss]=256 )
val=( [xmx]=756 [xms]=512 [xss]=128 )

for i in xmx xms xss
do 
    (( std[$i] > val[$i] )) && echo "$i: ${val[$i]}"
done

答案 1 :(得分:2)

一种方法:

unset offenders
test $xmsstd -gt $xms_val && offenders+=' xms'
test $xmxstd -gt $xmx_val && offenders+=' xmx'
test $xssstd -gt $xss_val && offenders+=' xss'
echo offenders:$offenders

你也可以“简化”一点:

unset offenders
for v in xms xss xmx; do
        eval test \$${v}std -gt \$${v}_val && offenders+=" $v"
done
echo offenders:$offenders

在那里引用Simplify,因为可以做出一个很好的论证,这使事情变得复杂而不是简化,我绝对更喜欢第一个,但如果变量的数量增加,它就不能很好地扩展。您当然可以使用数组而不是扁平字符串来跟踪满足约束的变量,但这样不太容易。

答案 2 :(得分:1)

结合-o(顺便说一下,所有但已弃用;甚至POSIX规范建议您使用test加入的单独的||命令)是因为当你不关心哪个时一个是真的,只要一个是真的。但是,你关心哪一个是真的,因为你想要生成与真实结果相关的输出。你必须有单独的陈述。

xmxstd=1024
xmsstd=512
xssstd=256

xmxval=756
xmsval=512
xssval=128

if [ $xmxstd > $xmxval ]; then
    echo "$xmxstd"
fi
if [ $xmsstd > $xmsval ]; then
    echo "$xmsstd"
fi
if [ $xssstd > $xssval ]; then
    echo "$xssstd"
fi

答案 3 :(得分:0)

如果使用BASH,你可以做:

for k in xms xss xmx; do
   kval="${k}val"
   kstd="${k}std"
   val="${!kval}"
   std="${!kstd}"
   (( std > val )) && echo "offending var: $kval with value: $val"
done