bash - 使用纯bash计算变量中行数的更简洁方法?

时间:2015-11-12 05:07:37

标签: bash

我有一个包含一些命令输出的变量,我想计算该输出中的行数。我试图使用纯粹的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"

有更清洁或更短的方法吗?

3 个答案:

答案 0 :(得分:3)

count_lines () (
  IFS=$'\n'
  set -f
  set -- $1
  echo $#
)

使用了一些技巧:

  1. 使用子shell而不是命令组定义函数,以将更改本地化为IFS-f shell选项。 (您可能不那么喜欢,而是使用local IFS=$'\n'代替,并在函数末尾运行set +f

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

  3. 更改IFS后,使用参数的不带引号参数展开设置函数的位置参数。

  4. 最后,输出位置参数的数量;原始论证中每行有一行。

答案 1 :(得分:1)

mongodb

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

答案 2 :(得分:0)

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

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