如何计算shell脚本中变量的行数
这里有点麻烦。我想将ls命令的输出捕获到变量中。然后稍后使用该变量并计算其中的行数。我试过一些变化 这是可行的,但如果没有.txt文件,则表示计数为1:如何计算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' 编辑:我应该
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。@GillesQuenotshopt
是bash
命令,不是ksh
的一部分。(这是我在写这个答案时发现的,这让我了解了特殊的~
-模式。)你能稍微解释一下~(N)*部分吗?这个符号叫什么?我有比*.txt更复杂的文件匹配逻辑要实现。我想它只是一个子模式;它被记录在“文件名生成”中在手册页中,在“引用”一节之前的一节末尾。(文档将其称为将不匹配的模式扩展到空字符串,我认为这不太准确。它似乎与bash
shell选项nullglob
,这会导致忽略不匹配的模式)完全相同。)
,在没有匹配文件的情况下,数组将包含单个元素*.txt
,而${testVar[@]}
将扩展为1,而不是0。@GillesQuenotshopt
是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