如何在Bash中比较包含方括号的字符串

问题描述:

我正在寻找与bash中的方括号进行比较。如何在Bash中比较包含方括号的字符串

情况:我有一个包含主机名,看起来像

[debian] 
ansible 
host 
names 

[centos] 
more 
hosts 

现在我想扫描所有主机的SSH密钥(第一回音,后来使用ssh-键扫描)hosts文件:

while read hostName 
do 
    if [[ $hostName != "" ]] && [[ $hostName != "\[*" ]] ; then 
    echo $hostName 
    #ssh-keyscan $hostName 
    fi 
done < hosts 

,而[[ $hostName != "" ]]它的工作是否包含方括号[[ $hostName != "\[*" ]]比较的部分没有。 ATM结果如下:

[debian] 
ansible 
host 
names 
[centos] 
more 
hosts 

我希望它看起来像:

ansible 
host 
names 
more 
hosts 

尽管如How to compare strings in Bash涵盖了一般话题,它不包括我的问题。另外,我希望避免使用sed或其他字符串替换方法,然后才能比较字符串-if可能。有人知道如何比较bash中的字符串中的方括号吗?

而且不工作: this solution,适应比较(也许我适应了错误的方式?):

if [[ $hostName != "" ]] && [ "$hostName" != "*[*" ] 
+0

看起来你联系将有助于在第一页上另一个答案:https://*.com/a/16263820/1354854。解决方案是'if [[$ hostName!= *“[”*]]'。通配符必须放在引号之外,这是不直观的,或者因为您正在使用'[['。 – bnaecker

+0

呵呵,没有看到那个。好的,这很有用:)。 – guz4217

这确实你需要什么,是POSIX兼容:

while read hostName 
do 
    if [ "$hostName" ] && [ "$hostName" = "${hostName#[}" ] ; then 
    echo $hostName 
    #ssh-keyscan $hostName 
    fi 
done < hosts 

替代# 1:

while read hostName 
do 
    if [[ $hostName != "" ]] && [[ $hostName != *"["* ]] ; then 
    echo "$hostName" 
    #ssh-keyscan $hostName 
fi 
done < hosts 

替代#2:

grep -v '^\[.*\]$' hosts | while read hostName 
do 
    if [[ $hostName != "" ]] ; then 
    echo "$hostName" 
    #ssh-keyscan $hostName 
fi 
done 

替代#3:

grep -v '^\[.*\]$' hosts | grep -v '^[ \t]*$' | while read hostName 
do 
    echo "$hostName" 
    #ssh-keyscan $hostName 
done