Вы очень хорошо объяснили ситуацию. Последний кусочек головоломки заключается в том, что unzip
может сам работать с символами подстановки:
http://www.info-zip.org/mans/unzip.html
АРГУМЕНТЫ
file[.zip]
...
Выражения с подстановочными знаками похожи на те, которые поддерживаются в широко используемых оболочках Unix (sh, ksh, csh) и могут содержать:
* соответствует последовательности из 0 или более символов
Заключив подстановочный знак * в кавычки, вы не позволили вашей оболочке расширить его, так что unzip
видит подстановочный знак и работает с его расширением в соответствии со своей собственной логикой.
rm
, напротив, не поддерживает подстановочные знаки самостоятельно, поэтому попытка привести подстановочный знак заставит rm
искать в имени файла литеральную звездочку.
Причина, по которой unzip *.zip
не работает, заключается в том, что синтаксис unzip
просто не позволяет использовать несколько zip-файлов; если есть несколько параметров, он ожидает, что второй и последующие будут файлами в архиве:
unzip [-Z] [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]] file[. zip] [file(s) ...] [-x xfile(s) ...] [-d exdir]
${TEST#...}
соответствует кратчайшей строке, состоящей из z и нуля пробелов. Вам нужно ${TEST##...}
, самое длинное совпадение.
Поскольку вы хотите имитировать регулярное выражение (perl), используйте регулярное выражение
, а не шаблон
:
$ test=" z abcdefg"
$ regex='^ *z *(.*)'
$ [[ $test =~ $regex ]]
$ echo ">>${BASH_REMATCH[1]}<<"
>>abcdefg<<
Регулярное выражение является расширенным регулярным выражением, а не полностью PCRE.