我正在使用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中是否可能这样做,但我只想在上述声明中回应出任何评估结果。也许我错过了一些愚蠢的东西,但我已经到处都找不到任何东西,我不想最终用三种不同的方式写出来,除非我不得不这样做。
答案 0 :(得分:3)
[ ]
测试的全部内容只有true
或false
,没有办法在不重新分割的情况下探测各个元素。
你说你不想使用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