如何显示输入Bash提示的最长行?

时间:2016-01-31 17:56:05

标签: bash shell string-comparison string-length

我试图找出一种显示从用户输入输入的最长行的方法。

例如,我的脚本到目前为止将有4行的用户输入:

  1.   

    您好

  2.   

    你好

  3.   

    你好,特纳

  4.   

    你好,特纳蜂蜜

  5. 在我的代码中,我有:

    echo "Please enter 4 lines:"        
    read LINE1
    read LINE2
    read LINE3
    read LINE4
    

    我想知道是否有办法让我计算每一行,然后输出最大的一行。制作文件可能是最简单的,但我想知道我是否可以使用Bash命令来执行此操作。

2 个答案:

答案 0 :(得分:1)

如果您只对最长的行感兴趣,那么您可以使用循环并将当前行与您阅读的下一行进行比较:

#!/bin/bash

   max=0

   for((i=0;i<4;i++)); do
     read -r line
     len=${#line}
     if [[ len -gt max ]] ; then
        max=$len
        long="${line}"
     fi
   done

echo longest line="${long}" length="${max}"

如果你想保留其他行,那么你可以使用数组并在数组上应用相同的逻辑。

答案 1 :(得分:1)

假设

当两条或更多条线的长度相同时,您不会解释您预期会发生什么。因此,我假设当两条线的长度相同时,应该存储并报告较新的线为“最长”。

比较行长度与Bash扩展

使用Bash 4.x执行此操作的更惯用(并且在我看来更清楚)的方式是:

#!/usr/bin/env bash

# Guard against exported environment variables.
unset longest_line

for line in {1..4}; do
    read -p "Enter line $line: "        
    (( "${#REPLY}" >= "${#longest_line}" )) && longest_line="$REPLY"
done

echo "$longest_line"

它使用各种shell expansions读取内置的-p标志来提示,读取默认的 REPLY 变量来保存结果,以及与目前为止执行关键任务的最长线进行的线长比较。

在这个例子中,您甚至不必为 longest_line 初始化一个值,因为未设置变量的长度为零,但这是一个很好的防御性编程实践,不依赖于变量是未设置。如果您希望自己实际设置变量的初始状态,可以使用longest_line=''将其设置为空字符串。

上面的代码将生成预期结果:

$ bash longest_line.sh 
Enter line 1: foo
Enter line 2: bar
Enter line 3: foo bar
Enter line 4: baz
foo bar