bash, le tableau de bord et comparaison de chaînes de caractères
Je suis en train de comparer deux chaînes de caractères dans un simple script shell.
J'ai été en utilisant /bin/sh
au lieu de /bin/bash
, et après d'innombrables heures de débogage, il s'avère sh (qui est en fait tableau de bord) ne peut pas gérer ce bloc de code:
if [ "$var" == "string" ]
then
do something
fi
Qu'est ce qu'un portable de façon à comparer des chaînes à l'aide de /bin/sh
? Je sais que je peux toujours faire le contraire en utilisant !=, mais je me pose des questions sur la propreté, la mobiles.
- Vous pouvez utiliser
[[ $var == "string" ]]
, qui est POSIX, mais en option (autant que je sache). Ou vous utilisez[ "$var" = "string" ]
. Remarque le""
autour de la variable dans le seul support de l'édition: c'est requise dans le cas$var
est vide - L'important, c'est les guillemets autour de
$var
comme litb mentionné. Sans les guillemets,[ $var = "value" ]
devient[ = "value" ]
qui confond la coquille assez horriblement. Vous verrez probablement une erreur du type "[: =: opérateur unaire attendu" quand vous rencontrez une variable vide sinon. - Je comprends que sur le "$var" contre $var, mon problème était d' == vs =
- [[ ]] est réservée par POSIX, mais pas du tout défini. C'est juste réservé parce que c'est un Korn fonctionnalité que je pense.
Vous devez vous connecter pour publier un commentaire.
dash
est un très stricte le shell POSIX, si il travail dansdash
il est presque certain qu'il allait travailler dans d'autres shell POSIX.Essayer:
=
au lieu de==
Pourquoi est-il même possible que votre script sera exécuté par le "mauvais" shell? Je pense que vous pourriez en faire un pré-requis de votre produit à l'aide de la norme sh-bang ligne en haut de votre script:
Même si un utilisateur utilise un environnement différent, les autres coquillages sont généralement toujours là et, si non, il suffit de se plaindre et qu'ils sont un pré-req.
Exactement de la même façon qu'un niveau du noyau, ou l'existence de awk, peut être un pré-req.
Spécifiques à votre question, je crois que les deux
sh
etbash
permettre le single '=' pour être utilisé pour les comparaisons de chaînes - qui est un comportement POSIX:Utilisation
=
au lieu de==
. Les comparaisons sont traitées par le test(1)./usr/bin/[
est généralement un lien vers/usr/bin/test
. La seule différence est que si vous utilisez[
dans un script shell, le]
est nécessaire.Noter que bash est doté d'un
test
/[
, donc il ne fait pas les utiliser/usr/bin/test
.Les réponses déjà postées sont certainement correctes, mais il peut être utile de noter qu'à l'occasion de paramètre d'expansion peut servir le même but, avec peut-être une flexibilité supplémentaire.
Ok, donc le ci-dessus n'est pas super utile, mais considèrent également que vous pouvez utiliser les mêmes méthodes pour tester les variables d'ici-documents en ligne, des assignations de variables si nécessaire (à un degré...), ou même simplement un plus court (et rapide!) les moyens de la rédaction de votre première déclaration.
Ou même...
Peut-être même...
vous pouvez utiliser awk