2010-11-02 3 views
13

Мне нужно проверить, имеет ли переменная значение строки, которая начинается с указанной подстроки.KSH проверить, начинается ли строка с подстроки

В Python, было бы что-то вроде этого:

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

Самый явный способ проверить в КШ ли стриг $foo начинается с подстроки bar?

ответ

23

Это очень простой, но выглядит немного странно:

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

Можно было бы предположить, что Ksh расширит шаблон с файлами в текущем каталоге, но вместо этого, он делает по шаблону. Однако вам нужен [[. Одиночный [ не будет работать. Котировки не являются строго необходимыми, если в foo нет пробелов.

+0

Внутри двойных скобок вам не нужны кавычки, даже если '$ foo' равен нулю или не задан. –

+0

Решение выглядит точно так же, как и то, что я искал. Но, к сожалению, это не работает в моем ksh. Это похоже на ksh88, я думаю, слишком старый для таких трюков. – z4y4ts

+0

Что делать, если '$ foo' имеет" = "в нем? – user443854

6

Вы также можете сделать регулярные выражения:

if [[ $foo =~ ^abc ]] 

Для более сложных моделей, я рекомендую использовать переменную вместо того, чтобы поместить шаблон непосредственно в тесте:

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

Также:

foo='abcdef' 
pattern='abc*' 

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

+1 для портативного решения –

+1

Вам, конечно, не нужна промежуточная переменная. 'case $ foo in 'abc' *) echo yes ;; esac' – tripleee

+1

переносной обратно в солярис 9/bin/sh и @ tripleee упрощение выше работ – lamont

Смежные вопросы