bash将整数变量与-gt-lt进行比较

bash将整数变量与-gt-lt进行比较,bash,Bash,我试图创建一个bash脚本,从文件中读取整数(每行一个数字,文件名作为脚本参数传递),查找最大值、最小值和总和。我在比较变量时遇到了一个问题。下面的代码(我在这里跳过了检查文件是否存在或是否为空的部分): 在这段代码中,我在第13行和第16行中遇到了错误:[::应该是整数表达式 如果我将while循环内的比较部分更改为: if [ $num -gt $max ] then max=$num elif [ $num -lt $min ] then min=$num

我试图创建一个bash脚本,从文件中读取整数(每行一个数字,文件名作为脚本参数传递),查找最大值、最小值和总和。我在比较变量时遇到了一个问题。下面的代码(我在这里跳过了检查文件是否存在或是否为空的部分):

在这段代码中,我在第13行和第16行中遇到了错误:[::应该是整数表达式

如果我将while循环内的比较部分更改为:

  if [ $num -gt $max ] 
  then
    max=$num
  elif [ $num -lt $min ]
  then
    min=$num
  fi
我收到错误:
第13行:[:-gt:应为一元运算符
第16行:[:-lt:应为一元运算符

我做错了什么?我是bash的新手,所以我非常感谢您的帮助

我用于测试的数据:

5
6
8
2
3
5
9
10


我猜是这样的表达

num=`cat "$1" | tail -n $lw | head -n 1`
在一次迭代中,为num分配一些不是数字的值。我建议在前一行中添加
echo“$num”
,以检查此假设可能您的输入文件包含DOS行结尾或其他不正确的格式。您的代码应适用于格式良好的输入

但是,在文件中循环行的正确方法是

!/bin/bash
最小值=$(sed 1q“$1”)
最大值=$min
总和=0
读取时-r num;执行
如果[“$num”-gt“$max”]
然后
max=$num
elif[“$num”-lt“$min”]
然后
最小值=$num
fi
((总和+=num))

完成另一件事:使用以下语法逐行读取文件比使用
cat | tail | head
读取行更容易

while IFS= read -r line
do
  echo "$line"
done < "$input"
当IFS=read-r行时
做
回音“$line”
完成<“$input”
这将把
输入
文件的内容读取到
变量中


有关
IFS=
-r
的解释,请参见此处-在您的情况下,这两个选项都不是必需的

您好,您是对的。我没有注意到测试数据中有一条空行。
while IFS= read -r line
do
  echo "$line"
done < "$input"