在bash中,我如何计算一个变量中的行数?
在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。
在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实现的方法,不依赖于外部命令,并且适用于所有情况。
在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
命令。根据具体的需求,选择合适的解决方法来计算变量中的行数。