Я пытаюсь написать Баш скрипт , который содержит функцию так , когда дан .tar
, .tar.bz2
, и .tar.gz
т.д. файл , он использует деготь с соответствующими переключателями , чтобы распаковать файл.
Я использую операторы if elif then, которые проверяют имя файла, чтобы увидеть, чем оно заканчивается, и я не могу заставить его соответствовать, используя метасимволы регулярных выражений.
Чтобы сохранить постоянное переписывание сценария, который я использую в командной строке 'test', я подумал, что приведенное ниже утверждение должно сработать, я перепробовал все возможные комбинации скобок, кавычек и метасимволов, и все же это не помогло.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Я уверен, что проблема проста, и я искал везде, но я не могу понять, как это сделать. Кто-нибудь знает, как я могу это сделать?
check="^a.*c$";if [[ "abc" =~ $check ]];then echo match;fi
нам нужно хранить регулярные выражения в var[[ sed-4.2.2.tar.bz2 == "*tar.bz2" ]]
не будет работать.[[ ! foo =~ bar ]]
.-n 1
параметр и не помещает его автоматически в$REPLY
переменную. Осторожно!Функция для этого
Другое примечание
В ответ на Силу Водолея в комментарии выше,
We need to store the regex on a var
Переменная BASH_REMATCH устанавливается после сопоставления выражения, а $ {BASH_REMATCH [n]} будет соответствовать n-й группе, заключенной в круглые скобки, т.е. в следующие
${BASH_REMATCH[1]} = "compressed"
и${BASH_REMATCH[2]} = ".gz"
(Вышеуказанное регулярное выражение не является допустимым для именования файлов и расширений, но оно работает для примера)
источник
a
в tar GNU илиp
в tar BSD явно указывать ему автоматически выводить тип сжатия из расширения. В противном случае GNU tar не сделает этого автоматически, и я думаю, из комментария @GoodPerson, что BSD tar делает это по умолчанию.У меня недостаточно представителей, чтобы комментировать здесь, поэтому я отправляю новый ответ, чтобы улучшить ответ собачьей страхи. Точка в регулярном выражении
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
будет фактически соответствовать любому символу, а не только буквальной точке между tar.bz2, например
или что-нибудь, что не требует экранирования с \. Строгий синтаксис должен быть
или вы можете пойти еще строже и также включить предыдущую точку в регулярное выражение:
источник
Поскольку вы используете bash, вам не нужно создавать дочерний процесс для этого. Вот одно решение, которое выполняет это полностью в bash:
Объяснение: Группы до и после последовательности «двоеточие и один или несколько пробелов» сохраняются оператором сопоставления с образцом в массиве BASH_REMATCH.
источник
Работает для меня!
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
источник
[[ ... ]]
шаблон rhs glob не расширяется в соответствии с текущим каталогом, как обычно.[[...]]
Bash не выполняет расширение имени файла. В руководстве по bashWord splitting and filename expansion are not performed on the words between the [[ and ]];
shopt -s nocasematch
источник