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