正确计算bash变量中的行数

7
我需要计算给定变量的行数。例如,我需要找出 VAR=$(git log -n 10 --format="%s") 中有多少行。echo "$VAR" | wc -l 可以实现,但如果 VAR 为空,则会输出 1,这是错误的。是否有更好的方法来解决这个问题?而不是使用 if 条件语句检查变量是否为空...(可能添加一行并从返回值中减去1?)

你想排除所有空行还是只有单个空行? - Kent
git log 会产生空输出或者一些行。因此,我需要处理变量为空的情况,因为如果变量不为空,就不会有空白行。 - linkyndy
这不是真的!git log -n 10确实会生成空行。但我明白你想要什么。 - Kent
抱歉我没有写完整的例子。我正在使用格式,所以我没有空行:git log -n 10 --format="%s" - linkyndy
4个回答

14

wc 统计 换行符数量。您可以使用 grep -c '^' 来计算行数。 您可以通过以下方式看到差异:

#!/bin/bash

count_it() {
    echo "Variablie contains $2: ==>$1<=="
    echo -n 'grep:'; echo -n "$1" | grep -c '^'
    echo -n 'wc  :'; echo -n "$1" | wc -l
    echo
}

VAR=''
count_it "$VAR" "empty variable"

VAR='one line'
count_it "$VAR" "one line without \n at the end"

VAR='line1
'
count_it "$VAR" "one line with \n at the end"

VAR='line1
line2'
count_it "$VAR" "two lines without \n at the end"

VAR='line1
line2
'
count_it "$VAR" "two lines with \n at the end"

什么会产生:

Variablie contains empty variable: ==><==
grep:0
wc  :       0

Variablie contains one line without \n at the end: ==>one line<==
grep:1
wc  :       0

Variablie contains one line with \n at the end: ==>line1
<==
grep:1
wc  :       1

Variablie contains two lines without \n at the end: ==>line1
line2<==
grep:2
wc  :       1

Variablie contains two lines with \n at the end: ==>line1
line2
<==
grep:2
wc  :       2

1
使用 grep -c '^' 是一个很好的建议。 - linkyndy

6

你可以根据条件进行编写:

[ -n "$VAR" ] && echo "$VAR" | wc -l || echo 0

这将检查$VAR是否有内容,并根据情况采取行动。

有点长,所以认为可能有更好的方法。 - linkyndy
一旦出现这种古怪的情况,我可能会采取稳妥的方法并将其明确地写出来。 - nemo

5

对于一个纯 bash 的解决方案:不要把 git 命令的输出放在变量中(这可能有些丑陋),而是将其放在一个数组中,每个字段占一行:

mapfile -t ary < <(git log -n 10 --format="%s")

然后你只需要计算数组ary中字段的数量:

echo "${#ary[@]}"

如果您需要检索第5个提交消息,这种设计也将使您的生活更加简单:

echo "${ary[4]}"

2

尝试:

echo "$VAR" | grep ^ | wc -l

2
简单点说,就是 grep -c '^' 命令,可以看一下我的回答。 ;) - clt60

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接