2015-10-21 2 views
0

Я работаю над скриптом, который использует getopts для ввода регулярного выражения как часть одной из опций. Этот параметр должен запустить выражение для указанного файла и распечатать результаты в командной строке.Регулярные выражения в bash

У меня есть это сохранение выражения в переменной, но тогда я не знаю, как правильно запустить выражение оттуда. Ниже приведены соответствующие разделы моего кода.

#!/bin/bash 

file="" 
sreg="" 
search=false 


while getopts c:s: flag; do 
    case $flag in 
    c) #file name 
     if ! [ -w "$OPTARG" ] 
     then 
       echo > "$OPTARG" 
     fi 
     file="$OPTARG"; 
;; 

    s) #search for contact (use grep) 
     search=true 
     sreg="$OPTARG"; 
;; 
    ?) 
     exit; 
;; 
    esac 
done 
shift $((OPTIND - 1)); 


if $search 
then 
     $sreg $file 
fi 

exit 
+1

Здесь много проблем, которые http://shellcheck.net/ поймают. 'if $ search' - ужасная практика - это означает, что вы выполняете произвольную команду в этой строке. Лучше использовать 'search = 0' /' search = 1' и 'if ((search))'. Требуется много мест для большего количества котировок. И убедитесь, что вы знаете о том, как работает встроенная поддержка регулярных выражений bash, хотя grep звучит как здесь правильно (поскольку вы просматриваете большой многострочный файл). –

+1

Кроме того, этот вопрос излишне усложняется из-за использования getopts. Почему бы просто не спросить об этом как однострочный с деталями, не связанными с вашей фактической проблемой? См. Также http://sscce.org/ и http://stackoverflow.com/help/mcve –

+0

Спасибо! Я новичок в Linux, так что все еще выясняю синтаксис и тому подобное. Разорвал его через shellcheck и исправил эти проблемы. – Joe

ответ

1

Просто используйте grep:

grep -e "$sreg" "$file" 

Кстати, вам не нужно цитировать переменные в назначениях.

file=$OPTARG # same as file="$OPTARG" 
+0

Я бы использовал '-e', так как мы не знаем, что может быть в' sreg', и анализирует ли он как аргумент. –

+0

@CharlesDuffy: добавлено, спасибо. – choroba

+0

Спасибо, я получил его сейчас! Одна из моих проблем заключалась в том, что я пытался передать grep как часть переменной. Дурак я... – Joe

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