在bash中,我如何计算一个变量中的行数?

18 浏览
0 Comments

在bash中,我如何计算一个变量中的行数?

我有一个变量,其中存储着一个字符串,并且需要检查它是否包含多行内容:

var=`ls "$sdir" | grep "$input"`

伪代码:

while [ ! $var的行数 -eq 1 ]
  做一些操作

这是我检查它的想法。 echo $var | wc -l 不起作用 - 它总是显示为 1,即使它有 3 行。

echo -e 也不起作用。

0
0 Comments

在bash中,如何计算一个变量中的行数?

有一个使用“here strings”在bash中的另一种方法:

wc -l <<< "$var"

此评论所述,一个空的$var会导致1行而不是0行,因为在这种情况下,“here strings”会添加一个换行符(解释)。

为了获得正确的答案,我必须这样做:wc -l <<<"$(echo "$var")"(是的,每个符号都是必要的)

那么你做错了什么?$var的内容是什么?

var="a\nb\nc"wc -l返回1

这是正确的,因为你的var只包含一行:你没有解释\n。将多行放入你的var中,它就会工作,例如:var="foo<ENTER>bar<ENTER>baz"<ENTER>

不起作用:wc -l <<< $undefined_var 返回1。应该返回0。测试了wc并发现,对于空或未定义的变量,它在所有情况下都返回1: wc -l(字节计数),wc -m选项(字符计数),wc -l。无论哪种情况都返回1,而不是0。请参考此答案以获取可行的解决方案。

xxd <<< '' 会创建这个十六进制转储 00000000: 0a。因此,“here strings”(<<<)会向任何内容添加换行符。

谢谢,我将你的输入添加到我的答案中。你可以在这里找到对这种行为的解释。

请注意,在默认的Ubuntu shell(DASH)中,不允许使用>>>。

问题被标记为bash,所以这不是一个downvote的原因。

我没有downvote任何东西,只是评论指出Ubuntu中默认的是dash而不是bash。放轻松点,伙计。

那么是我的错了,抱歉。我以为你downvote了,因为昨天你的评论之后我收到了一个downvote。

0
0 Comments

在bash中,如果要计算变量中的行数,可以使用以下方法:

echo -n "$VARIABLE" | grep -c '^'

例如:

ZERO=
ONE="just one line"
TWO="first
> second"
echo -n "$ZERO" | grep -c '^'
0
echo -n "$ONE" | grep -c '^'
1
echo -n "$TWO" | grep -c '^'
2

这个问题的原因是,之前提供的答案以及其他回答在变量为空(未定义或为空字符串)的情况下无法正常工作。因此,需要使用以上代码来解决这个问题。这段代码通过将变量的内容传递给`echo -n`命令,并使用`grep -c '^'`命令计算行数。

通过测试了各种情况,我们可以确定这是一个适用于所有情况的解决方法。此解决方法是唯一一个正确回答这个问题的方法。

另外,某些情况下可以使用`printf`代替`echo -n`来简化代码。但实际上,这并没有使代码更简单,因为关键在于`grep`部分。因此,我们仍然推荐使用以上的代码来解决这个问题。

如果想要了解更多关于在bash中计算变量行数的方法,请参考[这个链接](https://stackoverflow.com/a/52957175/9243840)。这个链接提供了一种使用纯bash实现的方法,不依赖于外部命令,并且适用于所有情况。

0
0 Comments

在bash中,如何计算变量中的行数?

这个问题的出现原因是用户想要知道在一个变量中有多少行。用户通过使用echo "$var" | wc -l命令来尝试计算变量中的行数。然而,用户遇到了一些问题。首先,用户提到了引号的重要性。用户意识到在使用echo "$var" | wc -l命令时,引号的位置很重要。如果没有正确地放置引号,命令可能无法正常工作。

在讨论中,其他用户提出了一个问题,即为什么要在命令周围加上双引号。一个用户解释说,这是因为他们使用了命令替换,即echo "$(ls /dir/ | grep "$string")"。这个例子是用户想要解决的特定情况,他们想要在命令中使用双引号。然而,其他用户解释说,这并不是将命令用双引号括起来,而是将命令替换用双引号括起来。这对于命令的功能没有影响。

另一个用户提出了一个细微之处,即空字符串会返回1,因为在空字符串上使用echo会打印一个换行符。为了解决这个问题,用户给出了一个更复杂的解决方法:if [ -z "$var" ]; then printf '%s\n' '0'; else printf '%s\n' "${var%$'\n'}" | wc -l; fi。这个解决方法可以正确地处理空字符串和非空字符串的情况。

还有其他用户提供了不同的解决方法。其中一个用户提到了使用LINE_COUNT=$(wc -l <<< "${var}")将行数存储到变量中的方法。另一个用户提出了使用echo -n命令来避免添加换行符,并在空字符串的情况下返回0。

总之,在bash中计算变量中的行数可以使用echo "$var" | wc -l命令。然而,要注意引号的位置以及空字符串的处理。还有其他一些方法可以解决这个问题,如使用命令替换和echo -n命令。根据具体的需求,选择合适的解决方法来计算变量中的行数。

0