Я пытаюсь написать bash-скрипт, который содержит функцию, поэтому, когда дали .деготь
, .тар.bz2 файл
, `.tar.gz и т. д. файл он использует смолу с соответствующими переключателями для распаковки файла.
Я использую если Элиф то заявления, которые проверить имя файла, чтобы увидеть, что он заканчивается и я не могу получить его, чтобы соответствовать с помощью регулярных выражений метасимволы.
Чтобы постоянно сохранять переписывать скрипт я использую 'тест' в командной строке, я думал, приведенная ниже инструкция должна работать, я пробовал все комбинации скобок, кавычек и можно metacharaters и до сих пор это не удается.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Я'м уверены, что проблема проста и я'вэ посмотрел везде, но я не могу понять как это сделать. Кто-нибудь знает как я могу это сделать?
Для сопоставления регулярных выражений нужно использовать оператор=~
.
Попробуйте это:
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
Кроме того, вы можете использовать подстановочные знаки (а не выражений) с помощью оператора==
:
[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched
Если портативность не важна, я рекомендую использовать [[
вместо [
или тест
как это безопаснее и мощнее. Видите какая разница между тест, [ и [[ ?]1 для деталей.
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
В ответ на Водолей сила в комментарии выше, мы должны хранить регулярное выражение переменной`
Переменная BASH_REMATCH задается после матча выражение, и ${BASH_REMATCH[н]} будет соответствовать N-й группы, завернутый в скобках, т. е. в следующий ${BASH_REMATCH[1]} = с "сжатый"
В и ${BASH_REMATCH[2]} = с ".я ГЗ&;
if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]];
then
echo ${BASH_REMATCH[2]} ;
else
echo "Not proper format";
fi
(В описаный выше это'т должно быть допустимым в имени файла и расширения, но это для примера)
Я не'т иметь достаточно репутации, чтобы комментарий здесь, так что я'м представляет новое решение для улучшения dogbane'ы ответ. Точка . в регулярном выражении
[[ СЭД-4.2.2.тар.расширением bz2 =~ смол.bz2 файл$ ]] &ампер;&ампер; Эхо совпали
фактически соответствует любому символу, не только на обычную точку между 'тар.bz2, что', например
[[ sed-4.2.2.tar4bz2 =~ tar.bz2$ ]] && echo matched
[[ sed-4.2.2.tar§bz2 =~ tar.bz2$ ]] && echo matched
или то, что не'т требует побега с '\'. Тогда строгий синтаксис должен быть
[[ sed-4.2.2.tar.bz2 =~ tar\.bz2$ ]] && echo matched
или вы можете пойти еще строже, а также включают в себя предыдущие точка в регулярном выражении:
[[ sed-4.2.2.tar.bz2 =~ \.tar\.bz2$ ]] && echo matched
Поскольку вы используете bash, вы Дон'т необходимость создания дочернего процесса для этого. Вот одно решение, которое выполняет его целиком в bash:
[[ $TEST =~ ^(.*):\ +(.*)$ ]] && TEST=${BASH_REMATCH[1]}:${BASH_REMATCH[2]}
Объяснение: группы до и после последовательности, что "двоеточие и один или более пробелов на" хранятся по шаблону оператором матч в BASH_REMATCH массива.
shopt -с nocasematch
if [[ sed-4.2.2.$LINE =~ (yes|y)$ ]]
then exit 0
fi
if [[ $STR == *pattern* ]]
then
echo "It is the string!"
else
echo "It's not him!"
fi
Работает для меня! В GNU bash, начиная с версии 4.3.11(1)-релиз (x86_64 с-ПК-Линукс-гну)