Bash脚本:在脚本中查找最小值

我正在编写一个脚本,它可以在字符串中找到最小值。 这个字符串是用一个cat <file>给我的,然后我解析这个字符串中的每个数字。 该字符串只包含一组由间隔分隔的数字。

这是代码:

echo $FREQUENCIES
for freq in $FREQUENCIES
do
    echo "Freq: $freq"
    if [ -z "$MINFREQ" ]
    then
        MINFREQ=$freq
        echo "Assigning MINFREQ for the first time with $freq"
    elif [ $MINFREQ -gt $freq ]
    then
        MINFREQ=$freq
        echo "Replacing MINFREQ with $freq"
    fi
done

这是我得到的输出:

800000 700000 600000 550000 500000 250000 125000 
Freq: 800000
Assigning MINFREQ for the first time with 800000
Freq: 700000
Replacing MINFREQ with 700000
Freq: 600000
Replacing MINFREQ with 600000
Freq: 550000
Replacing MINFREQ with 550000
Freq: 500000
Replacing MINFREQ with 500000
Freq: 250000
Replacing MINFREQ with 250000
Freq: 125000
Replacing MINFREQ with 125000
Freq: 
: integer expression expected

问题是,最后一行,由于某种原因,是空的或包含空格(我不知道为什么)。 我试着测试变量是否被设置:if [-n“$ freq”]但这个测试在这里似乎没有问题,它仍然通过最后一行的if语句。

有人能帮我弄清楚为什么最后一次循环执行时,$ freq被设置为空或空格,以及如何避免这种情况?

编辑:

using od -c feeded with echo "<<$freq>>"

0000000   <   <   8   0   0   0   0   0   >   >  n
0000013
0000000   <   <   7   0   0   0   0   0   >   >  n
0000013
0000000   <   <   6   0   0   0   0   0   >   >  n
0000013
0000000   <   <   5   5   0   0   0   0   >   >  n
0000013
0000000   <   <   5   0   0   0   0   0   >   >  n
0000013
0000000   <   <   2   5   0   0   0   0   >   >  n
0000013
0000000   <   <   1   2   5   0   0   0   >   >  n
0000013
0000000   <   <  r   >   >  n
0000006

似乎还有一个额外的 r(来自文件)。

非常感谢你!


如果你只使用整数值,你可以使用正则表达式来验证你的字符串:

elif [[ $freq =~ ^[0-9]+$ && $MINFREQ -gt $freq ]]

对于错误问题:您可能在$FREQUENCIES有一些额外的空白空间?

awk另一个解决方案

echo $FREQUENCIES | awk '{min=$1;for (i=1;i++;i<=NF) {if ( $i<min ) { min=$i } } ; print min }'

如果它是一个非常长的变量,你可以使用:

echo $FREQUENCIES | awk -v RS=" " 'NR==1 {min=$0} {if ( $0<min ) { min=$0 } } END {print min }'

(它将记录分隔符设置为空格,然后在第一个记录上将min设置为该值,然后对于每个记录检查它是否小于min并最终打印出来。

HTH


如果你使用bash,你有算术表达式和“if unset:use value and assign”参数替换:

#!/bin/bash
for freq in "$@"; do
    (( minfreq = freq < ${minfreq:=freq} ? freq : minfreq ))
done
echo $minfreq

使用:

./script 800000 700000 600000 550000 500000 250000 125000
链接地址: http://www.djcxy.com/p/97043.html

上一篇: Bash scripting: Find minimum value in a script

下一篇: "[ ]" vs. "[[ ]]" in Bash shell