我们刚开始在类中进行shell编程,我们必须编写一个程序,该程序应该列出当前目录中从3到5长度的所有名称。 我试图将代码放在一起,但它有点难。这是我来的,但它不会起作用。
for f in ls
do
if [ $f | wc -m -gt 3 -a $f |wc -m -lt 6 ]
then
echo $f
fi
done
我会感谢每一个有用的回应!
答案 0 :(得分:1)
(shopt -s nullglob; echo ??? ???? ?????)
nullglob
选项会导致所有不匹配的通配符变为空字符串。例如,如果您只有一个名为" test"的文件。在目录中,你得到' ???测试?????'没有nullglob
。
我添加了一个子shell,因此不会为整个终端会话设置nullglob。
答案 1 :(得分:0)
您需要for f in *
;可以使用$(ls)
,但这不能正确处理空格。
您需要使用$()
来实际运行测试中的命令:
$(echo "$f" | wc -m) -gt 3
注意echo
;您不希望将$f
作为命令运行!
避免使用test
这样的逻辑运算符,例如-a
;它无法进行真正的表达式解析,因此它们并不完全可靠。
只需使用${#f}
而不是致电wc
。
答案 2 :(得分:0)
这是使用find:
的单线程find . -type f -iname "???" -o -iname "?????"
?
是file globbing wildcard,匹配任何单个字符,因此要搜索只有3个字符的文件,可以使用???
。
关于-o
来自查找手册页:
运算符-or实现为-o,运算符-and实现为-a
因此,此示例仅返回字符长度为3或5的文件
打印名称在3到5个字符之间的所有文件的另一种变体可能是使用正则表达式,如下所示:
find . -type f -exec basename '{}' + | egrep '^.{3,5}$'
在这种情况下,find
将搜索当前目录.
中的所有文件,然后调用basename
以删除前导斜杠,egrep
或grep -E
然后用于仅使用正则表达式^.{3,5}$