我是shell脚本的新手。 我需要使用shell脚本将特定扩展名(.properties)的文件数保存在变量中。
我用过
ls |grep .properties$ |wc -l
但是此命令会打印文件夹中的属性文件数。如何在变量中分配此值。
我试过了
count=${ls |grep .properties$ |wc -l}
但它显示的错误如下:
./replicate.sh: line 57: ${ls |grep .properties$ |wc -l}: bad substitution
答案 0 :(得分:4)
你使用了错误的括号,它应该是$()
(命令输出替换)而不是${}
(变量替换)。
count=$(ls -1 | grep '\.properties$' | wc -l)
如果ls -1
没有自动为管道执行此操作,您还会注意到每行使用ls
强制一个文件,并更改了模式以正确匹配.
。
如果您使用以下内容,也可以完全绕过grep
count=$(ls -1 *.properties 2>/dev/null | wc -l)
请注意“邪恶”文件名,例如那些带有嵌入式换行符的文件名,尽管我的ls
似乎通过用?
字符替换换行符来处理这些问题 - 这不一定是个好主意用文件做事情,但它可以计算它们。
如果你有这样的野兽并且你需要实际的文件名,有更好的工具可以使用,但它们很少见,你通常不必担心它。
答案 1 :(得分:4)
你可以使用带有globbing的循环:
count=0
for i in *.properties; do
count=$((count+1))
done
答案 2 :(得分:3)
如果您使用的是支持数组的shell,则只需捕获所有此类文件名
即可files=( *.properties )
然后确定数组元素的数量
count=${#files[@]}
(以上假定bash
;其他shell可能需要稍微不同的语法。)
答案 3 :(得分:2)
您最好使用find
而不是解析ls
。然后,使用var=$(command)
语法来存储值。
var=$(find . -maxdepth 1 -name "*\.properties" | wc -l)
参考:Why you shouldn't parse the output of ls。
要解决在任何文件名包含新行时出现的问题,您可以使用chepner suggests in the comments:
var=$(find . -maxdepth 1 -name "*\.properties" -exec 'echo 1' | wc -l)
因此,对于每个匹配,它将不打印名称,而是打印任何随机字符(在这种情况下为1
),然后计算它们的数量以产生正确的输出。
答案 4 :(得分:1)
使用:
count=`ls|grep .properties$ | wc -l`
echo $count
答案 5 :(得分:1)
你可以像这样编写你的作业:
<?php echo CHtml::activeTextArea($model,'adremarks', array("id" => "adremarks"));?>
或
count=$(ls -q | grep -c '\.properties$')
如果要包含隐藏文件
这适用于所有类型的文件名,因为我们将count=$(ls -qA | grep -c '\.properties$')
与ls
一起使用
当然,链接到一些告诉你“从不解析ls”的网页比阅读q
手册更容易,并且看到有ls
选项(并且大多数实现默认到q
,如果输出到终端设备,这解释了为什么这里的某些人声明他们的q
似乎通过用ls
字符替换换行来处理带有换行符的文件名。< / p>