2010-11-02 4 views
13

Devo verificare se la variabile ha il valore di stringa che inizia con la sottostringa specificata.KSH verifica se la stringa inizia con la sottostringa

In Python, sarebbe qualcosa di simile:

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

Qual è il modo più esplicito per il check-in Ksh se strig $foo inizia con stringa bar?

risposta

23

E 'molto semplice, ma sembra un po' strano:

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

si potrebbe supporre che ksh sarebbe espandere il modello con i file nella directory corrente, ma, invece, lo fa pattern matching. È necessario il [[, tuttavia. Il singolo [ non funzionerà. Le virgolette non sono strettamente necessarie se non ci sono spazi in foo.

+0

Dentro parentesi doppie, non è necessario le virgolette anche se '$ pippo' è nullo o non impostato. –

+0

La soluzione sembra esattamente quella che stavo cercando. Ma sfortunatamente non funziona nel mio ksh. Sembra ksh88, immagino troppo vecchio per trucchi del genere. – z4y4ts

+0

Cosa succede se '$ pippo' ha" = "in esso? – user443854

6

Si può anche fare un match espressione regolare:

if [[ $foo =~ ^abc ]] 

Per i modelli più complessi, mi consiglia di utilizzare una variabile invece di mettere il modello direttamente nel test:

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

anche:

foo='abcdef' 
pattern='abc*' 

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

+1 per soluzione portatile –

+1

Non è certamente necessario la variabile provvisoria. 'caso $ pippo in 'abc' *) echo yes ;; esac' – tripleee

+1

portatile torna a solaris 9/bin/sh e la semplificazione @ triplo sopra funziona – lamont