如何在linux中找到两个变量的最小值

如何在linux中找到两个变量的最小值,linux,shell,ksh,Linux,Shell,Ksh,我有两个变量 $a和$b 是否有shell脚本命令将最小变量的值分配给$c i、 e 以及一些可以跨所有平台工作的命令—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

我有两个变量 $a和$b

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

i、 e

以及一些可以跨所有平台工作的命令—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
rm abc.log
near#dr=`sqlplus-s tcs384160/tcs#1234 actual.log

请忽略sqlplus部分,因为它们工作正常唯一的问题是$safe\u var需要两个值中的最小值

没有函数,但您可以创建它:

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

更新 似乎
$(())
语法出现了问题。因此,让我们将其替换为:

[ $a -le $b ] && echo "$a" || echo "$b"
或赋值:

min=$([ $a -le $b ] && echo "$a" || echo "$b")
样品
你也可以这样做:

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

echo$($x如果您确定变量的值是整数,请使用@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

在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
$near_dr=5 dr=10
$save_var=$(near_dr
因此,您可以编写一个函数:

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

safe_var=$(min $near_dr $DR)
min(){
echo$($1<$2?$1:$2))
}
安全变量=$(最小值$near\u dr$dr)
这与@Liaraz的答案相同,只是“变量可以在算术中通过名称引用”
不使用参数扩展语法的表达式。”(ksh手册页,算术计算部分)

Ksh93自定义算术函数示例:

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

.sh.value=$((恐怕我忘了提到小于或等于,感谢第13行的thoughsyntax错误:`min=$'在我尝试您的逻辑时意外出现此错误。您能建议解决方法吗?我不会得到此错误。我执行x=1和y=2以获得变量中的值。当您执行“z”时=$(($XD它是否与第12行的shellsyntax错误有关:`safe_var=$'意外(请查看我的问题的编辑你的shell是什么?你正在使用shell、zsh、ksh、bash吗?如果你想获得更多帮助,请提供更多信息。嗯,我刚刚用另一种方法更新了@user3186568。对不起,我的意思是我是新到这个网站的。我可以撤销它吗?你有时间取消通知,大约5分钟。然后投票会被冻结,除非帖子被删除。)是的。但如果这是一个错误,请不要担心,我只是不喜欢没有解释的否决票:)你部署了代码吗?
$near\u dr
$dr
的值是多少?你确定它们只是数字吗?ksh93显然让你定义算术函数,这样你就可以执行
safe\u var=$(min(near\u dr,dr)))
,但我还没有弄清楚如何返回值。
function.sh.math.min a b{echo$((a第17行的语法错误:`safe_var=$'意外错误您的ksh版本是什么?您可以通过分配给
.sh.value
-来分配数字返回值-来源:根据该引用添加了自定义算术函数的完整答案。
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
$ 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)
function .sh.math.min a b {
.sh.value=$(( a<b ? a : b ))
}
$ echo $(( min(1,3) ))                                        
1
$ echo $(( min(5,3) ))
3