Question

Je suis en train de comparer deux chaînes dans un script shell simple. J'utilisais /bin/sh au lieu de /bin/bash, et après d'innombrables heures de mise au point, il se trouve 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 moyen portable pour comparer des chaînes en utilisant /bin/sh? Je sais que je peux toujours faire le contraire en utilisant! =, Mais je me demande un produit de nettoyage, de manière portable.

Était-ce utile?

La solution

dash est une coquille POSIX très stricte, si elle fonctionne en dash il est presque certain qu'il travaillerait dans un autre shell POSIX.

Essayez:

if [ "$var" = "string" ]
then
    some_command
fi

Autres conseils

Pourquoi est-il même possible que votre script sera exécuté par le shell « mal »? Je pense que vous pourriez en faire une condition préalable de votre produit en utilisant la norme ligne sh-bang en haut de votre script:

#!/bin/bash

Même si un utilisateur utilise une coque différente, les autres coquilles sont généralement toujours là et, sinon, se plaignent simplement et de l'Etat qu'ils sont un pré-req.

Exactement de la même manière qu'un niveau spécifique du noyau, ou l'existence d'awk, peut être un pré-req.

Pour votre question, je crois que les deux sh et bash permettent le single « = » à utiliser pour les comparaisons de chaînes - c'est un comportement POSIX:

if [ "a" = "a" ] ; then
    echo yes
fi

yes

Utilisez = au lieu de ==. Les comparaisons sont traitées par un 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 également nécessaire.

Notez que bash a un intégré test / [, donc il ne se sert pas réellement /usr/bin/test.

Les réponses déjà affichées sont certainement correct, mais il peut être intéressant de noter que l'expansion de temps en temps paramètre peut servir le même but avec peut-être une certaine souplesse supplémentaire.

% p() { printf 'notvar = %b\n' "${notvar##"${string1}"}${string2}" ; }
% string1='some stuff about things\c'
% string2='some different stuff maybe'
% notvar="$string1" p
> 'some different stuff maybe'
% notvar="$string2" p
> 'some stuff about things'

Ok, donc ce qui précède n'est pas super utile comme il est, mais aussi considérer que vous pouvez utiliser les méthodes similaires pour les variables de test ici-documents, les affectations de variables en ligne si nécessaire (à un degré ...) , ou même comme un plus court (et plus rapide!) signifie d'écrire votre première déclaration.

[ ! "${var##"string"}" ] && _MATCH || _NOMATCH

Ou même ...

[ ${#var#*"${s=string}"} -lt ${#var} ] && _SUB_STRING_TEST=TRUE

Peut-être même ...

% p() { printf '%s is %s of %s' "$2" "${var_chk-not}" "$1"
> }<<HEREDOC
> ${in="${1##*"${2}"*}"}
> ${in:-
>     ${in="${1##"${2}"}"}
>     ${in:-${var_chk=all}
>     ${var_chk=some}
> }
> HEREDOC
%

vous pouvez utiliser awk

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top