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

时间:2011-11-21 21:38:51

标签: bash scripting

我正在编写一个脚本,用于查找字符串中的最小值。字符串以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 \ n(来自文件)。

非常感谢!

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

对于错误问题:$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

答案 2 :(得分:0)

如果你正在使用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

答案 3 :(得分:0)

数据: 10, 10.2, -3, 3.8, 3.4, 12

最低限度: echo -e“10 \ n10.2 \ n-3 \ n3.8 \ n3.4 \ n12”| sort -n |头-1
输出:-3

最高: echo -e“10 \ n10.2 \ n-3 \ n3.8 \ n3.4 \ n12”| sort -nr |头-1
输出:12


如何? :
1。逐行打印
2.对数字进行排序(反向获取最大值)
3。单独打印第一行。
简单!!

这可能不是一个好方法。但对学习者来说很容易。我确定。

答案 4 :(得分:0)

echo $FREQUENCIES | awk '{for (;NF-1;NF--) if ($1>$NF) $1=$NF} 1'
  • 比较第一个和最后一个字段
  • 将第一个字段设置为两个中较小的一个
  • 删除最后一个字段
  • 一旦剩下一个字段,请打印

Example