5

我试图弄清楚我认为 BASH 中的一个微不足道的问题,但我很难找到正确的语法。我想遍历一组值,其中一个是星号 (*),我不希望在此过程中发生任何通配符扩展。

 WHITELIST_DOMAINS="* *.foo.com *.bar.com"
 for domain in $WHITELIST_DOMAINS
 do
    echo "$domain"
 done

我有上述内容,我正在尝试获得以下输出:

 *
 *.foo.com
 *.bar.com

而不是上面的,我在当前目录上得到一个目录列表,然后是 *.foo.com 和 *.bar.com

我知道我需要在某处转义或引用……清晨的阴霾仍然笼罩在我的脑海中。

我回顾了这些问题:

如何在bash中的变量中逃避通配符扩展?

停止 shell 通配符扩展?

4

2 回答 2

6

您的问题是您想要一个数组,但是您编写了一个字符串,其中包含元素之间有空格的元素。请改用数组。

WHITELIST_DOMAINS=('*' '*.foo.com' '*.bar.com')

始终在变量替换(即 )周围使用双引号"$foo",否则 shell 会将变量的值拆分为单独的单词并将每个单词视为文件名通配符模式。命令替换也是如此:"$(somecommand)". 对于数组变量,用于"${array[@]}"展开到数组元素的列表。

for domain in "${WHITELIST_DOMAINS[@]}"
 do
    echo "$domain"
 done

有关更多信息,请参阅有关数组的 ba​​sh 常见问题解答

于 2012-11-06T13:56:30.467 回答
2

您可以使用数组来存储它们:

array=('*' '*.foo.com' '*.bar.com')

for i in "${array[@]}"
do
    echo "$i"
done
于 2012-11-06T13:48:51.460 回答