linux - 如何从 bash 中的标准输入获取最长和最短的行

标签 linux bash

我正在编写一个脚本来从标准输入中获取最长和最短的行,但没有成功。

要调用该程序,您应该使用类似的东西:

LongShort.sh /tmp/filetest.txt

我的脚本目前看起来像这样。

#! /bin/bash LongShort.sh

longest=0
shortest=0


while read line
do
   linelength=${#line}
   if [ "$linelength" -gt "$longest" ]
   then
     $longest = $line
     $longestlength = $linelength
   elif [ "$linelength" -lt "$shortest" ]
     then
        $shortest = $line
        $shortestlength = $linelength
   fi
done < $2

echo $longestlength $longest
echo $shortestlength $shortest

有没有人看出哪里出了问题?

最佳答案

您的脚本有几处错误:

  1. 您有时会使用 longest存储最长的行,有时用它来存储最长的行length
  2. 在 bash 中为变量赋值时,语法为 <name>=<value>没有空格。使用 $左侧的符号(通常)是错误的,因为您正试图将某些内容分配给存储在变量中的值。所以像 $longest = $line 这样的行应该改为longest=$line
  3. 通过初始化 shortest0 , 你向自己保证永远不会找到最短的线,因为没有线的长度永远不会小于 0 .您需要将其初始化为至少与文件中最短行一样大的值。

编辑:正如您自己指出的,最好将循环内部分成两个 if捕获最短行在前或所有行长度相同的情况的语句。

这是我的版本:

#!/bin/bash LongShort.sh

# use *length variables to store the lengths
longestlength=0
shortestlength=5000  # initialize shortestlength to something big


while read line
do
   linelength=${#line}
   if [ $linelength -gt $longestlength ];
   then
     longest=$line  # assign values properly
     longestlength=$linelength
   fi
   if [ $linelength -lt $shortestlength ];
   then
        shortest=$line
        shortestlength=$linelength
   fi
done < $2

echo $longestlength $longest
echo $shortestlength $shortest

关于linux - 如何从 bash 中的标准输入获取最长和最短的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27284969/

相关文章:

linux - 我想复制文件中的一行并进行一些更改

c - 警告 : format '%lu' expects argument of type 'long unsigned int' , 但参数 4 的类型为 'long unsigned int *' [-Wformat]

linux - 如何从内核模块使用 XPS(传输数据包控制)

linux - 如何在 AWS 弹性 beanstalk 上安装清漆缓存?

bash - 如何删除以反斜杠开头的任何字符串?

linux - 具有 shell 扩展的 Systemd 单元配置

linux - Nginx Proxy_Pass 到 CDN 与直接访问 CDN。优点,缺点,速度是否较慢或对服务器有负面影响?

bash - while 循环在附加文件 bash 中中断到早期

bash - 在 shell 别名中设置环境变量

linux - 带有负模式的 grep