如何在不使用“if;then”语法的情况下将“wc”的输出传递给不等式(-gt)?

如何在不使用“if;then”语法的情况下将“wc”的输出传递给不等式(-gt)?

我想计算与深度为 1 的模式匹配的文件数量,并将其与数字进行比较,例如,看看是否有 3 个或更多这样的文件。但是,我想在不使用 if/then 语法的情况下执行此操作。

即像这样:

ls -1q -d *patternX* | wc -l | [ -ge 3]

如果有人能让我知道是否有办法使用 if/then 语法来逃避,我将非常感激。谢谢!

答案1

您似乎想要计算匹配的名称数量*patternX*,然后测试它是否大于或等于三。

最好这样做:

shopt -s nullglob

set -- *patternX*
if [ "$#" -ge 3 ]; then
    echo 'More than 2 names match the pattern'
fi

这是将位置参数设置为与模式匹配的名称。匹配名称的数量将保存在 中$#。设置该nullglob选项的目的是,如果没有名称匹配,则模式将被完全删除而不是保持未展开状态。

您还可以使用命名数组来存储匹配的名称:

shopt -s nullglob

names=(*patternX*)
if [ "${#names[@]}" -ge 3 ]; then
    echo 'More than 2 names match the pattern'
fi

也可以看看为什么*不*解析`ls`(以及该怎么做)?


没有单词ifand then

shopt -s nullglob

set -- *patternX*
[ "$#" -ge 3 ] && echo 'More than 2 names match the pattern'

类似的方法使用awk

shopt -s nullglob

awk 'BEGIN { if (ARGC > 3) print "more than 2" }' *patternX*

请注意,ARGCinawk还表示命令名称($0shell 中的名称)。

答案2

对于zsh,您通常会使用匿名函数,例如:

()(( $# >= 3 )) *patternX*(N)

它调用一个匿名函数,其主体是(( $# >= 3 ))(返回真的如果参数数量为 3 或更多),则以*patternX*(N)glob 的扩展作为参数。

(N)是启用nullglob该 glob 的选项,以便 glob 扩展为空,而不是在没有匹配文件时报告错误。

对于您所问的问题,更直接的答案可能是:

ls -1q -d -- *patternX* | wc -l | xargs -IN test N -ge 3

(在任何 shell 中,但请注意,当模式与任何文件都不匹配时,不同 shell 的行为会有所不同)。

或者:

[ "$(( $(ls -1q -d -- *patternX* | wc -l) ))" -ge 3 ]

(在任何 POSIX 或类似 Korn 的 shell 中)

答案3

我很难相信这是一个现实世界的问题,但这里有一个解决方案:

ls -1q -d *patternX* | wc -l | egrep '^[3-9][0-9]*|[0-9][0-9]+' && echo JA

相关内容