2017-01-24 2 views
1

Мне нужна помощь со сценарием. Я хочу, чтобы этот сценарий отображал «Det funkar med serier» в мой файл журнала.Соответствие переменной оболочки

#!/bin/sh 

HDFILM1=/media/store1/HD-film 
HDFILM2=/media/store2/HD-film 
SERIER1="/media/store0/Serier*" 
SERIER2=/media/store2/Serier 

LOGFILE=/home/holmen/script/rtorrent_unrar_move_files.sh.log 

rm -rfv $LOGFILE 
echo 2 = $2 2>&1 >> $LOGFILE 
echo 3 = $3 2>&1 >> $LOGFILE 

if [ $3 = $HDFILM1 ] || [ $3 = $HDFILM2 ]; then 
     echo "Det funkar med filmer" 2>&1 >> $LOGFILE 
elif [[ $3 =~ $SERIER1 ]]; then 
     echo "Det funkar med serier" 2>&1 >> $LOGFILE 
else 
     echo "Det funkar INTE" 2>&1 >> $LOGFILE 
fi 

Выход в файл журнала.

2 = Family.Guy.S10E08.HDTV.Custom.HebSub.XviD-Extinct 
3 = /media/store0/Serier/Family_Guy 
Det funkar INTE 

Как вы можете видеть, я не могу получить регулярное выражение в $ SERIER1 переменной в работать и я не могу найти, как ее решить.

Я хочу, чтобы условие if соответствовало /media/store0/Serier/Family_Guy из регулярного выражения в переменной, например. ^/СМИ/store0/Serier

Как я получить, если часть

elif [[ $3 =~ $SERIER1 ]]; then 

Для работы?

+2

[shellcheck] (http://www.shellcheck.net) указывает на несколько вопросов, таких как '[[..]]' не определено в '/ bin/sh' (используйте'/bin/bash') , и '2> & 1 >> $ LOGFILE' не работает по назначению (используйте' >> $ LOGFILE 2> & 1') –

+0

Я буду тестировать/bin/bash, когда я вернусь домой – junkyhlm

+0

Вы используете некотируемые переменные внутри своего однострочного условия, которые в вашем конкретном случае не могут быть проблемой (без имен файлов, содержащих пробелы), но должны быть указаны как более надежные. Чтобы помочь отладке, попробуйте добавить «#!/Bin/bash -ue» в качестве первой строки, чтобы включить проверку расширенного расширения и сбой при отсутствии ненужных кодов возврата. Это часто помогает понять, откуда возникают проблемы, не допуская неудачи. – Fred

ответ

1

Обратите внимание, что переменная SERIER1 имеет не содержит регулярное выражение. Он содержит глобус. Globs - еще один язык спецификации шаблона, такой как regexp, но они несовместимы.

В Glob, * означает ноль или больше ничего

В регулярном выражении, * означает ноль или больше предыдущего символа

Это различие важно. Шаблон:

r* 

В Glob соответствует rainbow и range и r

В регулярных выражений соответствует r и rr и rrrrrr

Итак, картина у вас есть:

/media/store0/Serier* 

только матч: /media/store0/Serier o г /media/store0/Serierrr или /media/store0/Serierrrrrrr т.д.

Я предполагаю, что вы хотите:

/media/store0/Serier.* 

Поскольку в регулярном выражении . означает ничего. Таким образом, .* означает ноль или более всего, что эквивалентно * в glob.

+0

Правда; OP может использовать glob, хотя и с '=' оператором внутри '[[...]]'. – chepner

+0

Спасибо, поэтому мне нужно что-то вроде этого: SERIER1 =/media/store0/Serier /.*, а затем elif [[$ 3 = ~ $ SERIER1]] я прав? – junkyhlm

+0

@junkyhlm Да. Или, как сказал chepner, вы также можете использовать '=' оператор с glob вместо '= ~' с regexp – slebetman

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