Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确计算bash变量的行数_Bash_Shell_Wc - Fatal编程技术网

正确计算bash变量的行数

正确计算bash变量的行数,bash,shell,wc,Bash,Shell,Wc,我需要计算给定变量的行数。例如,我需要找到VAR有多少行,其中VAR=$(git log-n 10--format=“%s”) 我尝试了echo“$VAR”| wc-l),这确实有效,但如果VAR为空,则会打印1,这是错误的。有解决办法吗?比使用if子句检查变量是否为空更好的方法…(可能添加一行并从返回值中减去1?。您始终可以有条件地编写它: [ -n "$VAR" ] && echo "$VAR" | wc -l || echo 0 这将检查$VAR是否有内容并相应地执行。w

我需要计算给定变量的行数。例如,我需要找到
VAR
有多少行,其中
VAR=$(git log-n 10--format=“%s”)


我尝试了
echo“$VAR”| wc-l)
,这确实有效,但如果
VAR
为空,则会打印
1
,这是错误的。有解决办法吗?比使用
if
子句检查变量是否为空更好的方法…(可能添加一行并从返回值中减去1?。

您始终可以有条件地编写它:

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

这将检查
$VAR
是否有内容并相应地执行。

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"
#/bin/bash
数一数{
echo“变量包含$2:==>1try:


对于纯bash解决方案:不要将
git
命令的输出放入变量(可以说,变量很难看),而是将其放入数组中,每个字段一行:

mapfile -t ary < <(git log -n 10 --format="%s")
如果您需要检索第5条提交消息,此设计还将使您的生活更简单:

echo "${ary[4]}"

你想排除所有空行还是只有一个空行?
git log
要么不生成任何内容,要么生成一些行。因此我需要处理空变量的情况,因为如果变量不为空,就不会有空行。这不是真的!
git log-n 10
确实生成空行。但是我得到了你想要的。对不起,我尚未编写完整的示例。我正在使用format,因此没有空行:
git log-n 10--format=“%s“
。它有点长,这就是为什么我认为有更好的方法。当它变得如此古怪时,我可能会选择安全的方法并明确地写出来。:)或者更简单:
grep-c'^'
-请看我的答案;)使用
grep-c'^'
的好建议。
mapfile -t ary < <(git log -n 10 --format="%s")
echo "${#ary[@]}"
echo "${ary[4]}"