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
