我有一个包含一些命令输出的变量,我想计算该输出中的行数。我试图使用纯粹的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"
有更清洁或更短的方法吗?
答案 0 :(得分:3)
count_lines () (
IFS=$'\n'
set -f
set -- $1
echo $#
)
使用了一些技巧:
使用子shell而不是命令组定义函数,以将更改本地化为IFS
和-f
shell选项。 (您可能不那么喜欢,而是使用local IFS=$'\n'
代替,并在函数末尾运行set +f
。
禁用文件名生成,以避免参数中的任何元字符扩展并干扰行数。
更改IFS
后,使用参数的不带引号参数展开设置函数的位置参数。
最后,输出位置参数的数量;原始论证中每行有一行。
答案 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