以下正则表达式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]
。与正则表达式一样,文件名扩展也旨在匹配某些内容;它旨在匹配文件名。
碰巧的是,您当前的工作目录中没有名称与模式匹配的文件,因此字符串不会被扩展,最终ping
会tax[13]-eq-dc
作为参数获取。如果您有一个名为的文件tax1-eq-dc
或一个名为的文件tax3-eq-dc
,那么模式将扩展为一个或两个单词,扩展为所有匹配的名称现存的文件,然后您将运行一到两次ping
尝试 pingtax1-eq-dc
或tax3-eq-dc
或两者。
依赖文件的存在在这里毫无意义。很可能你不想匹配文件名。你可能想要一个括号扩展:tax{1,3}-eq-dc
。这会扩展为两个独立的单词:tax1-eq-dc
和tax3-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
用括号扩展来替换,但您的问题并非如此。