如何在 Bash 循环中使用“tax[13]-eq-dc”正则表达式?

如何在 Bash 循环中使用“tax[13]-eq-dc”正则表达式?

以下正则表达式tax[13]-eq-dc代表两个服务器,tax1-eq-dc 和 tax3-eq-dc。
我试图找到一种方法在 Bash do 循环中使用它,但无法获得正确的语法。

例如,以下说法是错误的:

$ for i in tax[13]-eq-dc; do ping -c3 $i; done
ping: unknown host tax[13]-eq-dc

任何想法什么是正确的语法?

答案1

tax[13]-eq-dc可能看起来像正则表达式,但在你的代码中,Bash 不会将其视为正则表达式。即使它确实如此,正则表达式也会匹配某物。你想搭配什么?

Bash 把你tax[13]-eq-dc当作文件名扩展(通配符)模式。它不是正则表达式,尽管[13]它与正则表达式有些相似[13]。与正则表达式一样,文件名扩展也旨在匹配某些内容;它旨在匹配文件名。

碰巧的是,您当前的工作目录中没有名称与模式匹配的文件,因此字符串不会被扩展,最终pingtax[13]-eq-dc作为参数获取。如果您有一个名为的文件tax1-eq-dc或一个名为的文件tax3-eq-dc,那么模式将扩展为一个或两个单词,扩展为所有匹配的名称现存的文件,然后您将运行一到两次ping尝试 pingtax1-eq-dctax3-eq-dc或两者。

依赖文件的存在在这里毫无意义。很可能你不想匹配文件名。你可能想要一个括号扩展tax{1,3}-eq-dc。这会扩展为两个独立的单词:tax1-eq-dctax3-eq-dc,并且它是纯文本扩展,与文件无关。

文件名扩展是一个可移植的功能,而括号扩展则不是。

for i in tax{1,3}-eq-dc; do ping -c3 "$i"; done

答案2

我想知道当你的代码不需要它时你为什么要使用正则表达式:

for i in 1 3; do ping -c3 tax${i}-eq-dc; done

确实,如果需要更多数字,您可以1 3用括号扩展来替换,但您的问题并非如此。

相关内容