Comment comparer une variable à une chaîne (et faire quelque chose si elles correspondent)?
Comment comparer une variable à une chaîne (et faire quelque chose si elles correspondent)?
Réponses:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Si vous voulez faire quelque chose quand ils ne correspondent pas, remplacez-le =
par !=
. Vous pouvez en savoir plus sur les opérations de chaîne et les opérations arithmétiques dans leur documentation respective.
$x
?Vous voulez les guillemets $x
, car s'il est vide, votre script Bash rencontre une erreur de syntaxe comme indiqué ci-dessous:
if [ = "valid" ]; then
==
opérateurNotez que Bash permet ==
d'être utilisé pour l'égalité avec [
, mais ce n'est pas standard .
Utilisez soit le premier cas où les guillemets autour $x
sont facultatifs:
if [[ "$x" == "valid" ]]; then
ou utilisez le deuxième cas:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. La modification de ["$ 1" = "on"] a résolu le problème.
=
et non deux.
[ $x -eq "valid" ]
. -eq
est l'opérateur de comparaison des entiers, pas des chaînes.
["x$yes" == "xyes"]
, c'est-à-dire le préfixe de la variable et du littéral de chaîne avec un x
? Est-ce une relique d'autrefois ou est-ce vraiment nécessaire dans certaines situations?
Ou, si vous n'avez pas besoin d'une autre clause:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
peut échouer.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
est plus efficace que ( echo invalid && false )
, car il évite de payer pour un sous-shell inutile.
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Remarques:
if
et [
et ]
sont importants>
et <
sont des opérateurs de redirection donc échappez-lui avec \>
et \<
respectivement pour les chaînes.$a
réellement " "
dans le cadre de la valeur littérale de la chaîne, j'ai donc dû utiliser le caractère d'échappement $b
pour comparer les valeurs. J'ai pu le trouver après l'exécution bash -x ./script.sh
, l'indicateur -x vous permet de voir la valeur de chaque exécution et aide au débogage.
Pour comparer des chaînes avec des caractères génériques, utilisez
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
autour des caractères génériques. (btw: +1 pour les caractères génériques!)
$stringB
doit être cité (et, soit dit en passant, le côté gauche n'a pas besoin d'être cité): if [[ $stringA = *"$stringB"* ]]; then
.
Je suis en désaccord avec l'un des commentaires sur un point:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
C'est juste que ça ressemble à un, hmm, les non-initiés ...
Il utilise des modèles communs comme une langue, en quelque sorte;
Et après avoir appris la langue.
Il s'agit d'une expression logique simple, avec une partie spéciale: l'évaluation paresseuse des opérateurs logiques.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Chaque partie est une expression logique; le premier peut être vrai ou faux, les deux autres sont toujours vrais.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Maintenant, quand il est évalué, le premier est vérifié. S'il est faux, alors le deuxième opérande de la logique et &&
après il n'est pas pertinent. Le premier n'est pas vrai, il ne peut donc pas être le premier et le second de toute façon.
Maintenant, dans ce cas, c'est le premier côté de la logique ou ||
faux, mais cela pourrait être vrai si l'autre côté - la troisième partie - est vrai.
La troisième partie sera donc évaluée - principalement en écrivant le message comme un effet secondaire. (Il a le résultat 0
pour true, que nous n'utilisons pas ici)
Les autres cas sont similaires, mais plus simples - et - je le promets! sont - peuvent être - faciles à lire!
(Je n'en ai pas, mais je pense qu'être un vétéran d'UNIX avec une barbe grise y contribue beaucoup.)
... && ... || ...
est généralement mal vu (désolé vétéran barbe grise d'Unix, vous vous trompez depuis tout ce temps), car il n'est pas sémantiquement équivalent à if ... then ... else ...
. Ne vous inquiétez pas, c'est un piège courant .
... && ... || ...
est un modèle parfaitement valide et un idiome bash commun. Son utilisation prescrit des connaissances préalables (ce qui peut être utile de garder à l'esprit s'il y a des débutants dans le public), mais OP a les cheveux pour prouver qu'ils savent comment éviter les couvercles de trous d'homme ouverts.
vous pouvez également utiliser le cas d'utilisation / esac
case "$string" in
"$pattern" ) echo "found";;
esac
|
, avant le )
. L' in
instruction est équivalente à then
dans les if
instructions. Vous pourriez faire valoir que cela fonctionne sur une liste de modèles, où chaque liste a sa propre déclaration de quoi faire, si vous venez de Python. Pas comme substring in string
, mais plutôt for item in list
. Utilisez a *
comme dernière instruction si vous souhaitez une else
condition. Il revient à la première rencontre.
Le script suivant lit un fichier nommé "testonthis" ligne par ligne, puis compare chaque ligne avec une chaîne simple, une chaîne avec des caractères spéciaux et une expression régulière. S'il ne correspond pas, le script imprimera la ligne, sinon non.
L'espace dans Bash est tellement important. Donc, ce qui suit fonctionnera:
[ "$LINE" != "table_name" ]
Mais ce qui suit ne le fera pas:
["$LINE" != "table_name"]
Veuillez donc utiliser tel quel:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
mais parce que [
c'est en fait un binaire externe (comme dans which [
donne quelque chose comme /usr/bin/[
)
J'utiliserais probablement des correspondances d'expressions régulières si l'entrée n'a que quelques entrées valides. Par exemple, seuls "démarrer" et "arrêter" sont des actions valides.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Notez que je minuscule la variable $ACTION
en utilisant la virgule double. Notez également que cela ne fonctionnera pas sur les versions bash trop anciennes.
Exemples Bash 4+. Remarque: ne pas utiliser de guillemets entraînera des problèmes lorsque les mots contiennent des espaces, etc. Toujours citer dans Bash, IMO.
Voici quelques exemples dans Bash 4+:
Exemple 1, vérifiez «oui» dans la chaîne (insensible à la casse):
if [[ "${str,,}" == *"yes"* ]] ;then
Exemple 2, vérifiez «oui» dans la chaîne (insensible à la casse):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Exemple 3, vérifiez «oui» dans la chaîne (sensible à la casse):
if [[ "${str}" == *"yes"* ]] ;then
Exemple 4, vérifiez «oui» dans la chaîne (sensible à la casse):
if [[ "${str}" =~ "yes" ]] ;then
Exemple 5, correspondance exacte (sensible à la casse):
if [[ "${str}" == "yes" ]] ;then
Exemple 6, correspondance exacte (insensible à la casse):
if [[ "${str,,}" == "yes" ]] ;then
Exemple 7, correspondance exacte:
if [ "$a" = "$b" ] ;then
Prendre plaisir.
if [ "$a"="$b" ]
ou cela ne fonctionne pas ... ne peut pas avoir d'espaces autour des égaux
Je l'ai fait de cette manière qui est compatible avec Bash et Dash (sh):
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
(
et ne pas l'utiliser?