echo 如何识别何时应输出文件列表或纯文本?

echo 如何识别何时应输出文件列表或纯文本?

我在测试中遇到了这个问题:让 echo 输出所有以元音(a,e,i,o,u,e)开头,以数字结尾并且至少有3个字符的目录。我以为这会很容易,但很快我就感到困惑并最终失败了。我的第一个想法很简单:

echo {a,e,i,o,u,e}*{0..9}

然后我尝试使用方括号

echo [a,e,i,o,u,e]*[0..9]

最后我尝试了这样的事情:

echo $(ls {a,e,i,o,u,e}*{0..9})

这给了我所需的输出,但有一些错误目录缺少消息,我什至不确定它是否不会被视为作弊,因为我使用另一个函数来做到这一点。

谁能帮我澄清一下,我该怎么做以及何时使用哪些括号?我还想知道,echo 如何识别何时应该输出目录列表而不是我的确切单词。

答案1

延长莫斯维的评论罗艾玛的澄清, 我会建议:

echo [aeiou]?*[0-9]/

这使用文件名扩展(通配)功能来满足您的要求:

  • 目录或目录的符号链接(尾部斜杠/
  • 以英语小写元音 ( [aeiou])开头
  • 至少包含一个附加字符 ( ?)
  • 并且有至少三个字符(*将匹配零个或多个字符,添加到我们已经匹配的两个字符以及我们最后匹配的字符,如下所示)
  • 以十进制数字 ( [0-9])结尾

您的 shell 扩展所有匹配的目录名称并将它们传递给echo,后者只是将它们回显出来。

但请注意,对于某些 shell,包括bash, 如果有如果目录符合要求,您的 shell 将保留该模式并将其直接传递给该模式,echo该模式将再次回显该模式,从而产生以下输出:

[aeiou]?*[0-9]/

您可以在 bash 中稍微调整一下,通过设置“nullglob”选项,该选项告诉 bash 当没有(空)匹配(glob)时,消除模式,在这种情况下,不会将任何内容传递给echo,然后只会打印一个空行。或者使用failglob失败的 glob 的选项来触发错误。

相关内容