【问题标题】:Loop over array, preventing wildcard expansion (*)循环数组,防止通配符扩展 (*)
【发布时间】:2012-11-06 13:44:06
【问题描述】:

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

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

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

 *
 *.foo.com
 *.bar.com

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

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

我已经查看了这些问题:

How to escape wildcard expansion in a variable in bash?

Stop shell wildcard character expansion?

【问题讨论】:

    标签: bash variables wildcard expansion


    【解决方案1】:

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

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

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

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

    有关详细信息,请参阅the bash FAQ about arrays

    【讨论】:

    • 手掌牢牢地贴在脸上 -- 我应该知道我没有使用数组,感谢您如此清晰 -- 快速地指出这一点。
    • @"否则,shell 会将变量的值拆分为单独的单词,并将每个单词视为文件名通配符模式" 在多种语言之间移动时,shell 脚本的这一方面可能是最难记住的.谢谢你让我记忆犹新。
    【解决方案2】:

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

    array=('*' '*.foo.com' '*.bar.com')
    
    for i in "${array[@]}"
    do
        echo "$i"
    done
    

    【讨论】:

    • 这与接受的答案相同,只是@Giles 为未来通过谷歌闲逛的用户提供了更有用的解释。为了完整和后代,我已经接受了他对你的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2012-07-12
    • 2014-10-08
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多