如何在linux中找到两个变量的min

时间:2014-01-30 09:42:32

标签: linux shell ksh

我有两个变量 $ a和$ b

是否有shell脚本命令将最小变量的值赋给$ c

$c = min($a,$b) 

和一些可以在所有平台上运行的命令hp-ux,aix,linux_x_64

提前致谢

编辑: 默认shell是ksh

以及脚本我试图运行

rm abc.log 
near_dr=`sqlplus -s tcs384160/tcs#1234 <<\EOF
set pagesize 0 feedback off verify off heading off echo off
select max(sequence#) from v$archived_log where applied='YES' and thread#=1 and 
dest_id=2;


exit;
EOF`
DR=`sqlplus -s tcs384160/tcs#1234 <<\EOF
set pagesize 0 feedback off verify off heading off echo off 

select max(sequence#) from v$archived_log where applied='YES' and thread#=1 and

 dest_id=3;
 exit;
 EOF`
safe_var=$([ $near_dr -le $DR ] && echo "$near_dr" || echo "$DR")
echo $safe_var;
ulimit=`expr $safe_var - 30`;
llimit=`expr $ulimit - 1000`;
echo $llimit;
echo $ulimit;
i=$llimit
while [ $i -le $ulimit ];
do
  ls  evdprd_1_${i}_*.arc>>abc.log;
  let i=i+1;
done;




recover -s ttlhydnwr -c tphtpsd2<<EOF  >> abc.log
ls -1 *.arc
exit
EOF
sed -e 's/[\t ]//g;/^$/d' abc.log > abc1.log
awk '++seen[$0] == 2' abc1.log > actual.log

请忽略sqlplus部分,因为那些工作正常唯一的问题是$ safe_var需要两个值中的最小值

5 个答案:

答案 0 :(得分:4)

没有功能,但您可以创建它:

(( $a <= $b )) && echo "$a" || echo "$b"

condition && action1 || action2会评估条件。如果是,则执行action1;否则,执行action2

要将结果存储到变量中,请执行以下操作:

min=$( (( $a <= $b )) && echo "$a" || echo "$b" )

更新

似乎$( (( )) )语法存在问题。因此,让我们将其替换为:

[ $a -le $b ] && echo "$a" || echo "$b"

或指定值:

min=$([ $a -le $b ] && echo "$a" || echo "$b")

示例

$ a=3
$ b=4
$ [ $a -le $b ] && echo "$a" || echo "$b"
3

$ b=1
$ [ $a -le $b ] && echo "$a" || echo "$b"
1

$ b=3
$ [ $a -le $b ] && echo "$a" || echo "$b"
3

答案 1 :(得分:2)

你也可以这样做:

x=1
y=2
echo $(($x<$y?$x:$y))
1

将值存储在其他变量中:

z=$(($x<$y?$x:$y))   #Min
z=$(($x<=$y?$x:$y))  #Min and equal
z=$(($x>$y?$x:$y))   #Greater
z=$(($x>=$y?$x:$y))  #Greater and equal

答案 2 :(得分:1)

在ksh中,这很好用

$ near_dr=5 DR=10                        
$ save_var=$(( near_dr < DR ? near_dr : DR )) ; echo $save_var
5
$ near_dr=15 DR=10                                            
$ save_var=$(( near_dr < DR ? near_dr : DR )) ; echo $save_var
10
$ near_dr=15 DR=15                                            
$ save_var=$(( near_dr < DR ? near_dr : DR )) ; echo $save_var
15

所以你可以写一个函数:

min() {
    echo $(( $1 < $2 ? $1 : $2 ))
}

safe_var=$(min $near_dr $DR)

这与@Liaraz的答案相同,除了“变量可以在算术中通过名称引用        不使用参数扩展语法的表达式。“(ksh手册页,算术评估部分)

答案 3 :(得分:1)

Ksh93自定义算术函数示例:

function .sh.math.min a b {
.sh.value=$(( a<b ? a : b ))
}
$ echo $(( min(1,3) ))                                        
1
$ echo $(( min(5,3) ))
3

答案 4 :(得分:0)

如果您确定变量的值是整数,请使用@ fedorqui的答案。它简短而整洁。

然而,如果你不确定,那么它们可能是例如浮点数:

kent$ a=3.57
kent$ b=13.5
kent$ (($a < $b)) && echo "y" || echo "n"
bash: ((: 3.57 < 13.5: syntax error: invalid arithmetic operator (error token is ".57 < 13.5")
n

这适用于所有情况:

kent$ awk -v a="$a" -v b="$b" 'BEGIN{print (a>b)?b:a}'
3.57