2013-12-04 5 views
0

У меня есть условие if в моем сценарии оболочки, в котором используются регулярные выражения. В основном я хотел узнать, содержит ли $ main строку $ pattrn.KShell сравнение регулярных выражений не работает

main="$line1" 
pattrn="$line" 
if [[ $main = @($pattrn) ]]; 
then 
echo $line>>/lawson/prod/work/errval 
fi 

Даже если у меня мало подходящих значений, но это Если условие не возвращает ничего.

Заранее спасибо

+0

Рассмотрите возможность изменения вашего вопроса, чтобы включить в него образцы значений, которые будут найдены в '$ line1' и' $ line'. Удачи. – shellter

+2

не использует регулярные выражения. Он использует шаблоны glob - прочитайте раздел «Генерация имени файла» вашей man-страницы ksh. –

+0

Вам нужно показать, что ваш шаблон для нас, чтобы сказать, что не так. – cdarke

ответ

0

Я думаю, что у меня есть решение, хотя может быть более элегантное решение с СЭД или AWK.

#!/bin/ksh 
variable1="ABCDEF" 
variable2="CDE" 

printf "variable1(%s)\n" $variable1 

if(echo $variable1 | grep -q $variable2); then 
    printf "variable2 appears in variable1\n" 
fi 

variable3="GHI" 

if(echo $variable1 | grep -q $variable3); then 
    printf "variable3 appears in variable1\n" 
else 
    printf "variable3 does not appears in variable1\n" 
fi 

Выход

variable1(ABCDEF) 
variable2 appears in variable1 
variable3 does not appears in variable1 

Объяснение: Вы проверяете значение, возвращаемое командой в скобках, чтобы гарантировать, что результат равен 0. С Grep после трубы, вы проверяете, если Grep нашел строку в выходной строке из эха.

Надеюсь, что это поможет.

0

Я хотел выяснить, содержит ли $ main строку $ pattrn.

if [[ $main = @($pattrn) ]] 

Эти тесты на точно равный матч. Для того, чтобы проверить, если $mainсодержит$pattrn, мы должны указать, что может быть текст до и после $pattrn:

if [[ $main = @(*$pattrn*) ]] 

Кстати, так как у нас есть только один шаблон, мы можем обойтись без @(…), а также:

if [[ $main = *$pattrn* ]] 
Смежные вопросы