1162 votes

En bash, comment puis-je vérifier si une chaîne commence avec une certaine valeur?

Je voudrais vérifier si une chaîne commence par un "nœud" par exemple "node001". Quelque chose comme

if [ $HOST == user* ]  
  then  
  echo yes  
fi

Comment puis-je le faire correctement?


Mise à JOUR:

Merci beaucoup! J'ai encore besoin de combiner des expressions pour vérifier si l'HÔTE est "user1" ou commence par un "nœud"

if [ [[ $HOST == user1 ]] -o [[ $HOST == node* ]] ];  
then  
echo yes 
fi

> > > -bash: [: too many arguments

Comment le faire correctement?

1558voto

Mark Rushakoff Points 97350

Cet extrait sur le Advanced Bash Scripting Guide dit:

# The == comparison operator behaves differently within a double-brackets
# test than within single brackets.

[[ $a == z* ]]   # True if $a starts with an "z" (wildcard matching).
[[ $a == "z*" ]] # True if $a is equal to z* (literal matching).

Si vous l'aviez presque correct; vous aviez besoin de double crochets, pas de simples crochets.


En ce qui concerne votre deuxième question, vous pouvez écrire de cette façon:

HOST=user1
if  [[ $HOST == user1 ]] || [[ $HOST == node* ]] ;
then
    echo yes1
fi

HOST=node001
if [[ $HOST == user1 ]] || [[ $HOST == node* ]] ;
then
    echo yes2
fi

Ce qui se fera l'écho de

yes1
yes2

Bash est if syntaxe est difficile de s'y habituer (OMI).

381voto

Brabster Points 18764

Si vous utilisez un récent bash (v3+) suggèrent bash regex opérateur de comparaison =~, c'est à dire

if [[ "$HOST" =~ ^user.* ]]; then
    echo "yes"
fi

Pour correspondre this or that dans une regex utiliser |, c'est à dire

if [[ "$HOST" =~ ^user.*|^host1 ]]; then
    echo "yes"
fi

Note - ces est 'bonne' la syntaxe d'expression régulière.

  • user* moyen use et zéro ou plus occurrences de r, alors use et userrrr sera à la hauteur.
  • user.* moyen user et zéro ou plusieurs occurrences de n'importe quel caractère, alors user1, userX sera à la hauteur.
  • ^user.* moyen correspond au modèle user.* au début de $HOST.

Si vous n'êtes pas familier avec la syntaxe d'expression régulière, essayez se référant à cette ressource.

Note - c'est mieux si vous demandez à chaque nouvelle question nouvelle question, fait stackoverflow plus propre et plus utile. Vous pouvez toujours inclure un lien vers une question précédente de référence.

281voto

Jo So Points 4602

Je ne peux pas supporter de bash. J'essaie toujours de rester avec POSIX sh comme l'un des principaux points de script est la portabilité. (En outre, le couplage de programmes, pas de les remplacer)

Ce cas est simple:

[ ! "${HOST##node*}" ]

ou, comme l'a déjà souligné)

case $HOST in node*) true;; *) false;; esac

Vous pouvez l'utiliser de cette façon:

if case $HOST in node*) true;; *) false;; esac; then
    your code here
fi

ou tout simplement

case $HOST in node*)
    your code here
;; esac

119voto

martin clayton Points 41306

Vous pouvez sélectionner la partie de la chaîne que vous voulez vérifier:

if [ ${HOST:0:4} = user ]

Pour votre question, vous pouvez utiliser un OU une:

if [[ $HOST == user1 || $HOST == node* ]]

65voto

Dennis Williamson Points 105818

Je préfère les autres méthodes déjà posté, mais certaines personnes aiment à utiliser:

case "$HOST" in 
    user1|node*) 
            echo "yes";;
        *)
            echo "no";;
esac

Edit:

J'ai ajouté votre suppléants pour le cas énoncé ci-dessus

Dans votre version, vous avez trop de crochets. Il devrait ressembler à ceci:

if [[ $HOST == user1 || $HOST == node* ]];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X