Bash scripting: Find minimum value in a script

I am writing a script that finds the minimum value in a string. The string is given to me with a cat <file> and then I parse each number inside that string. The string only contains a set of numbers that is separated by spaced.

This is the code:

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

Here is the output I get:

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

The problem is that the last line, for some reason, is empty or contain white spaces (I am not sure why). I tried testing if the variable was set: if [ -n "$freq" ] but this test doesn't seem to work fine here, it still goes through the if statement for the last line.

Could someone please help me figure out why the last time the loop executes, $freq is set to empty or whitespace and how to avoid this please?

EDIT:

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

There seems to be an extra r (from the file).

Thank you very much!


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

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

For the error problem: you might have some extra white space in $FREQUENCIES ?

Another solution with awk

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

If it's a really long variable, you can go with:

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

(It sets the record separator to space, then on the very first record sets the min to the value, then for every record check if it's smaller than min and finally prints it.

HTH


If you are using bash you have arithmetic expressions and the "if unset: use value and assign" parameter substitution:

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

use:

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

上一篇: shell脚本中的双括号存在问题

下一篇: Bash脚本:在脚本中查找最小值