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

abr*_*bra -1 bash pipe

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

即像这样:

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

Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 5

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

最好这样做:

shopt -s nullglob

set -- *patternX*
if [ "$#" -ge 3 ]; then
    echo 'More than 2 names match the pattern'
fi
Run Code Online (Sandbox Code Playgroud)

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

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

shopt -s nullglob

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

另请参阅为什么*不*解析`ls`(以及该怎么做)?


没有单词ifand then

shopt -s nullglob

set -- *patternX*
[ "$#" -ge 3 ] && echo 'More than 2 names match the pattern'
Run Code Online (Sandbox Code Playgroud)

类似的方法使用awk

shopt -s nullglob

awk 'BEGIN { if (ARGC > 3) print "more than 2" }' *patternX*
Run Code Online (Sandbox Code Playgroud)

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

  • @abra 那么,就像 `[ "$(... | wc)" -ge 3 ]`? (2认同)
  • @abra 请编辑您的问题并添加所有这些要求。您所要求的不是标准功能,我们大多数人都乐意使用“if/else”或“condition && foo ||” bar` 构造因此如果您不能使用我们需要知道。 (2认同)