我在测试中遇到了这个问题:让 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 的选项来触发错误。