2010-11-02 14 views
13

Muszę sprawdzić, czy zmienna ma wartość łańcucha, który zaczyna się od podanego podciągu.KSH sprawdź, czy ciąg rozpoczyna się od podłańcucha

W Pythonie byłoby coś takiego:

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

Co jest najbardziej wyraźny sposób, by sprawdzić, czy w Ksh strig $foo rozpoczyna się z podciągu bar?

Odpowiedz

23

To bardzo proste, ale wygląda nieco dziwnie:

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

Można by przypuszczać, że ksh by rozwinąć wzór z plików znajdujących się w bieżącym katalogu, ale zamiast tego, to nie pasujące do wzorca. Potrzebujesz jednak [[. Pojedynczy [ nie będzie działać. Cytaty nie są bezwzględnie konieczne, jeśli nie ma pustych pól w foo.

+0

Wewnątrz podwójnych nawiasów, nie potrzebujesz cytatów, nawet jeśli '$ foo' ma wartość null lub nie jest ustawione. –

+0

Rozwiązanie wygląda dokładnie tak, jak tego szukałem. Ale niestety to nie działa w moim ksh. Wygląda jak ksh88, chyba za stary na takie sztuczki. – z4y4ts

+0

Co jeśli '$ foo' ma w sobie" = "? – user443854

6

Można również zrobić regex dopasowywania:

if [[ $foo =~ ^abc ]] 

Dla bardziej skomplikowanych wzorów, polecam użyciu zmiennej zamiast umieszczenie wzoru bezpośrednio w teście:

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

też:

foo='abcdef' 
pattern='abc*' 

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

+1 dla rozwiązania przenośnego –

+1

Z pewnością nie potrzebujesz zmiennej tymczasowej. 'case $ foo w 'abc' *) echo yes ;; esac' – tripleee

+1

przenośny powrót do systemu solaris 9/bin/sh i @ tripleee upraszcza pracę – lamont

Powiązane problemy