2017-09-15 154 views
1

我正在尋找與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://stackoverflow.com/a/16263820/1354854。解決方案是'if [[$ hostName!= *「[」*]]'。通配符必須放在引號之外,這是不直觀的,或者因爲您正在使用'[['。 – bnaecker

+0

呵呵,沒有看到那個。好的,這很有用:)。 – guz4217

回答

0

這確實你需要什麼,是POSIX兼容:

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

替代# 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