我试图弄清楚我认为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中的变量中逃脱通配符的扩展?
停止外壳通配符扩展?
您的问题是您想要一个数组,但是您写了一个包含它们之间空格的元素的单个字符串。改用数组。
WHITELIST_DOMAINS=('*' '*.foo.com' '*.bar.com')
始终在变量替换周围使用双引号(即"$foo"
),否则,壳将变量的值分为单独的单词,并将每个单词视为文件名通配符模式。命令替换也是如此:"$(somecommand)"
。对于数组变量,请使用"${array[@]}"
扩展到数组元素的列表。
for domain in "${WHITELIST_DOMAINS[@]}"
do
echo "$domain"
done
有关更多信息,请参见有关数组的bash常见问题。
您可以使用数组存储它们:
array=('*' '*.foo.com' '*.bar.com')
for i in "${array[@]}"
do
echo "$i"
done