【问题标题】:How can I display the longest line entered into a Bash prompt?如何显示输入到 Bash 提示符中的最长行?
【发布时间】:2016-05-09 02:51:31
【问题描述】:

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

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

  1. 你好

  2. 你好会

  3. 你好会特纳

  4. 亲爱的,你好会特纳

在我的代码中:

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

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

【问题讨论】:

    标签: bash shell string-comparison string-length


    【解决方案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}"
    

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

    【讨论】:

      【解决方案2】:

      假设

      当两行或多行长度相同时,您没有解释预期会发生什么。因此,我假设当两行长度相同时,应该将新行存储并报告为“最长”。

      比较行长和 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内置的-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
      

      【讨论】:

      • 感谢您的回答,您提出了一个非常好的观点,即如果线条长度相同会发生什么。我已将您的回答铭记于心。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2021-04-20
      相关资源
      最近更新 更多