2017-09-15 5 views
1

Je cherche une comparaison avec des crochets dans bash.Comment comparer les chaînes contenant un crochet dans Bash

Situation: J'ai un fichier hosts qui contient les noms d'hôte qui ressemble

[debian] 
ansible 
host 
names 

[centos] 
more 
hosts 

maintenant je veux scanner les clés ssh (premier écho, utiliser plus tard-keyscan ssh) de tous les hôtes:

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

tandis que [[ $hostName != "" ]] fait son travail la partie contenant la comparaison pour les crochets [[ $hostName != "\[*" ]] ne fait pas. Atm le résultat ressemble à ceci:

[debian] 
ansible 
host 
names 
[centos] 
more 
hosts 

Je veux que ça ressemble à:

ansible 
host 
names 
more 
hosts 

Bien que par exemple How to compare strings in Bash couvre le sujet général, il ne couvre pas ma question. Aussi, je voudrais éviter d'utiliser sed ou d'autres méthodes de remplacement de chaîne avant de pouvoir comparer la chaîne-si possible. Est-ce que quelqu'un sait comment comparer les crochets dans une chaîne de bash?

Aussi ne fonctionne pas: this solution, adapté comparaison (peut-être j'adaptèrent dans le mauvais sens?):

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

On dirait une autre réponse sur la première page Indexés aider: https://stackoverflow.com/a/16263820/1354854. La solution est 'if [[$ hostName! = *" ["*]]'. Le caractère générique doit être _outside_ les guillemets, ce qui n'est pas intuitif, ou tout simplement non-guillemet entièrement puisque vous utilisez '[['. – bnaecker

+0

Huh, n'a pas vu celui-là. OK ça marche, merci beaucoup :). – guz4217

Répondre

0

Cela fait ce que vous avez besoin et est POSIX compatible:

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

# Alternative 1:

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

Alternative # 2:

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

Alternative # 3:

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