2010-11-02 6 views
13

Je dois vérifier si la variable a une valeur de chaîne qui commence par la sous-chaîne spécifiée.KSH vérifie si la chaîne commence par la sous-chaîne

En Python, il serait quelque chose comme ceci:

foo = 'abcdef' 
if foo.startswith('abc'): 
    print 'Success' 

Quelle est la manière la plus explicite pour vérifier si ksh STRIG $foo commence par sous-chaîne bar?

Répondre

23

Il est très simple, mais semble un peu bizarre:

if [[ "$foo" == abc* ]]; then ... 

On pourrait supposer que ksh élargirait le modèle avec les fichiers dans le répertoire courant, mais au contraire, il ne pattern matching. Vous avez besoin du [[, cependant. Seul [ ne fonctionnera pas. Les guillemets ne sont pas strictement nécessaires s'il n'y a pas d'espaces vides dans foo.

+0

A l'intérieur des doubles crochets, vous n'avez pas besoin de guillemets même si '$ foo' est nul ou non défini. –

+0

La solution ressemble exactement à ce que je cherchais. Mais malheureusement ça ne marche pas dans mon ksh. On dirait ksh88, je devine trop vieux pour de tels trucs. – z4y4ts

+0

Que faire si '$ foo' a" = "dedans? – user443854

6

Vous pouvez également faire de la correspondance regex:

if [[ $foo =~ ^abc ]] 

Pour des modèles plus complexes, je recommande d'utiliser une variable au lieu de mettre le modèle directement dans le test:

bar='^begin (abc|def|ghi)[^ ]* end$' 
if [[ $foo =~ $bar ]] 
17

aussi:

foo='abcdef' 
pattern='abc*' 

case "$foo" in 
    $pattern) echo startswith ;; 
    *) echo otherwise ;; 
esac 
+0

+1 pour solution portable –

+1

Vous n'avez certainement pas besoin de la variable intérimaire. 'case $ foo dans 'abc' *) echo oui ;; esac' – tripleee

+1

portable retour à solaris 9/bin/sh et la simplification @ tripleee ci-dessus fonctionne – lamont

Questions connexes