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

How can I display the longest line entered into a Bash prompt?

我正在尝试找出一种方法来显示用户输入的最长行。

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

  1. Hello

  2. Hello will

  3. Hello will turner

  4. Hello will turner honey

在我的代码中我有:

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

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

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

#!/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}"

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

假设

您没有解释当两条或多条线的长度相同时您期望发生什么。因此,我假设当两行长度相同时,应该将较新的行存储并报告为 "longest."

将行长度与 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 expansionsread builtin的-p标志来提示,read的默认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