Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
如何计算shell脚本中变量的行数_Shell_Unix_Ksh - Fatal编程技术网

如何计算shell脚本中变量的行数

如何计算shell脚本中变量的行数,shell,unix,ksh,Shell,Unix,Ksh,这里有点麻烦。我想将ls命令的输出捕获到变量中。然后稍后使用该变量并计算其中的行数。我试过一些变化 这是可行的,但如果没有.txt文件,则表示计数为1: testVar=`ls -1 *.txt` count=`wc -l <<< $testVar` echo '$count' 此变体还表示,当不存在.txt文件时,计数为1: testVar=`ls -1 *.txt` count=`echo '$testVar' | wc -l` echo '$count' 编辑:我应该

这里有点麻烦。我想将ls命令的输出捕获到变量中。然后稍后使用该变量并计算其中的行数。我试过一些变化

这是可行的,但如果没有.txt文件,则表示计数为1:

testVar=`ls -1 *.txt`
count=`wc -l <<< $testVar`
echo '$count'
此变体还表示,当不存在.txt文件时,计数为1:

testVar=`ls -1 *.txt`
count=`echo '$testVar' | wc -l`
echo '$count'

编辑:我应该提到这是korn shell。

正确的方法是使用数组

# Use ~(N) so that if the match fails, the array is empty instead
# of containing the pattern itself as the single entry.
testVar=( ~(N)*.txt )
count=${#testVar[@]}

正确的方法是使用数组

# Use ~(N) so that if the match fails, the array is empty instead
# of containing the pattern itself as the single entry.
testVar=( ~(N)*.txt )
count=${#testVar[@]}

您也可以这样使用:

#!/bin/bash

testVar=`ls -1 *.txt`

if [ -z "$testVar" ]; then
        # Empty
        count=0
else
        # Not Empty
        count=`wc -l <<< "$testVar"`
fi

echo "Count : $count"
#/bin/bash
testVar=`ls-1*.txt`
如果[-z“$testVar”];然后
#空的
计数=0
其他的
#不空

count=`wc-l您也可以这样使用:

#!/bin/bash

testVar=`ls -1 *.txt`

if [ -z "$testVar" ]; then
        # Empty
        count=0
else
        # Not Empty
        count=`wc -l <<< "$testVar"`
fi

echo "Count : $count"
#/bin/bash
testVar=`ls-1*.txt`
如果[-z“$testVar”];然后
#空的
计数=0
其他的
#不空

count=`wc-l我打算建议这样做,这是我在bash中使用的一个构造:

f=($(</path/to/file))
echo ${#f[@]}

f=($)(我打算提出这个建议,这是我在bash中使用的一个构造:

f=($(</path/to/file))
echo ${#f[@]}

f=($(这个小问题实际上包括三个标准shell gotchas(bash和kornshell)的结果:


  • 这里的字符串(
    这个小问题实际上包括三个标准shell gotchas(bash和kornshell)的结果:


  • 这里是字符串(
    这很有帮助,但我想了解为什么需要这样做。如果输出为空,wc会接收到什么?@user3349673,如果输入为空而作为
    此处字符串传递,
    wc
    将作为一行计算。您可以使用命令检查它:
    wc-l@user3349673,除非它是
    EOF
    (Ctrl+D),
    wc
    增加了它的行数。@user3349673:sat的解释不太准确,但完整的解释太长,无法发表评论,所以我给出了一个答案。这很有帮助,但我想了解为什么需要这样做。如果输出为空,wc会起什么作用?@user3349673,如果输入为空,则作为
    HERESTRING
    wc
    作为一行计算。您可以使用命令检查它:
    wc-l@user3349673,除非它是
    EOF
    (Ctrl+D),
    wc
    增加了它的行数。@user3349673:sat的解释不太准确,但完整的解释太长,无法发表评论,所以我给出了答案。你能解释一下吗*一点?这个符号叫什么?我有比*.txt更复杂的文件匹配逻辑要实现。我认为它只是一个子模式;它记录在手册页的“文件名生成”下,在“引用”部分之前的一节末尾。(文档将其称为将不匹配的模式扩展到空字符串,我认为这不太准确。它似乎与
    bash
    shell选项
    nullglob
    ,这会导致忽略不匹配的模式)完全相同。)
    ,在没有匹配文件的情况下,数组将包含单个元素
    *.txt
    ,而
    ${testVar[@]}
    将扩展为1,而不是0。@GillesQuenot
    shopt
    bash
    命令,不是
    ksh
    的一部分。(这是我在写这个答案时发现的,这让我了解了特殊的
    ~
    -模式。)你能稍微解释一下~(N)*部分吗?这个符号叫什么?我有比*.txt更复杂的文件匹配逻辑要实现。我想它只是一个子模式;它被记录在“文件名生成”中在手册页中,在“引用”一节之前的一节末尾。(文档将其称为将不匹配的模式扩展到空字符串,我认为这不太准确。它似乎与
    bash
    shell选项
    nullglob
    ,这会导致忽略不匹配的模式)完全相同。)
    ,在没有匹配文件的情况下,数组将包含单个元素
    *.txt
    ,而
    ${testVar[@]}
    将扩展为1,而不是0。@GillesQuenot
    shopt
    bash
    命令,不是
    ksh
    的一部分。(这是我在写这个答案时发现的,这让我了解了特殊的
    ~
    -模式。)
    f=()
    for file in *.txt; do
        f+=($(<$file))
    done
    
    var=$(cmd)
    utility <<<"$var"
    
    var=$(cmd)
    printf %s "$cmd" | utility
    
    var=$(cmd)
    printf %s "${var}" | grep '' | utility