【问题标题】:bash - cleaner way to count the number of lines in a variable using pure bash?bash - 使用纯 bash 计算变量中行数的更简洁方法?
【发布时间】:2015-11-12 20:28:43
【问题描述】:

我有一个包含一些命令输出的变量,我想计算该输出中的行数。我正在尝试使用纯 bash 来做到这一点(而不是像 this question 那样通过管道连接到 wc)。

我想出的最好的方法似乎有点麻烦:

function count_lines() {
    num_lines=0
    while IFS='' read -r line; do
        ((num_lines++))
    done <<< "$1"
    echo "$num_lines"
}

count_lines "$my_var"

有没有更简洁或更短的方法来做到这一点?

【问题讨论】:

  • 为什么要避开wc?但如果你绝对想避免它,你的功能似乎是要走的路。

标签: bash


【解决方案1】:
count_lines () (
  IFS=$'\n'
  set -f
  set -- $1
  echo $#
)

使用的一些技巧:

  1. 该函数是使用子shell 而不是命令组定义的,以将更改本地化为IFS-f shell 选项。 (你可以不那么花哨,改用local IFS=$'\n',并在函数结束时运行set +f)。

  2. 禁用文件名生成以避免参数中的任何元字符扩展和干扰行数。

  3. 一旦IFS 被更改,使用unquoted 参数扩展为参数设置函数的位置参数。

  4. 最后输出位置参数个数;原始参数中的每一行都有一个。

【讨论】:

    【解决方案2】:
    IFS=$'\n'
    set -f
    x=( $variable )
    

    现在 ${#x[@]} 将包含“行”的数量。 (使用“set +f”撤消“set -f”。)

    【讨论】:

      【解决方案3】:

      我想出的另一个可能的解决方案:

      export x=0;while read i;do export x=$(($x+1));done &lt; /path/to/your/file;echo $x

      【讨论】:

      • in awk(GNU 工具,不是 bash 内部):awk 'END{print NR}' &lt; /path/to/your/file
      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多