2015-06-21 8 views
3

Предположим, у меня есть список с именами файлов в нем с датой. Я хочу что-то делать с файлами с расширением png или jpg определенной даты. У меня есть следующий код:Использование расширения скобки в выражении if

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

ответ

2

{...} не распространяется на if состояние. Вы можете использовать extglob:

shopt -s extglob 

[[ $f = *"$year"[email protected](png|jpg) ]] && echo "$f" 

Вы можете даже не нужен цикл с extglob, вы можете просто сделать:

printf "%s\n" *"$year"[email protected](png|jpg) 
+0

я раньше не знал об этом, это круто. Вы, где я могу получить больше информации о вариантах 'shopt', я попробовал мужчину, ничего не получилось. Я могу видеть другие варианты, не подавая никаких аргументов, хотя я не знаю, что они означают. Также знаете ли вы способ включить другие параметры, такие как 'autocd' для всех будущих логинов, кроме добавления его в' .bashrc'? – user14492

+2

Вы можете сделать 'help shopt' и просто' shopt', чтобы узнать, какие параметры установлены в вашей оболочке. – anubhava

1

Вы также можете использовать расширения параметров /извлечения подстроки построить тест, а также:

year="2015" 
for f in $myFiles 
do 
    if [ x${f##*${year}.jpg} = x -o x${f##*${year}.png} = x ] 
    then 
     echo $f 
    fi 
done 

Примечание:x просто добавляется к обеим сторонам теста, чтобы избежать проверки пустой строки (например, вместо "${f##*${year}.jpg}" = "")

2

Вы можете использовать Bash сопоставления регулярных выражений:

pat="(.*)($year)(\.png|\.jpg)" 
... 
if [[ $f =~ $pat ]] 

Пример:

year="2015" 
pat="(.*)($year)(\.png|\.jpg)" 
for f in $myFiles 
do 
    if [[ $f =~ $pat ]] 
    then 
     ext="${BASH_REMATCH[3]}" # This is the extension, .png or .jpg 
     # Additionally ${BASH_REMATCH[1]} is the part before $year in $f. 
     echo "$f" "$ext" 
    fi 
done 
+0

'(\ .png | \ .jpg)' можно сократить до '\. (Png | jpg)'. (Или даже '\. (Pn | jp) g', но это немного глупо.) – Biffen

+0

@Biffen then' $ ext' будет содержать 'png' not' .png'. Я хотел, чтобы это было '.png' для удобства, и обратите внимание, что' (\ .png | \ .jpg) '- захваченная группа. – Jahid

+0

Справедливая точка. '(\. (png | jpg))' может быть компромиссом. Или 'ext =". $ {BASH_REMATCH [3]} "' ☺ – Biffen

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