bash - extglob 2-й оператор «ноль или больше» не работает

Вы очень хорошо объяснили ситуацию. Последний кусочек головоломки заключается в том, что 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]

3
28.06.2017, 01:58
2 ответа

${TEST#...} соответствует кратчайшей строке, состоящей из z и нуля пробелов. Вам нужно ${TEST##...}, самое длинное совпадение.

6
27.01.2020, 21:09

Поскольку вы хотите имитировать регулярное выражение (perl), используйте регулярное выражение, а не шаблон:

$ test="    z abcdefg"
$ regex='^ *z *(.*)'
$ [[ $test =~ $regex ]]
$ echo ">>${BASH_REMATCH[1]}<<"
>>abcdefg<<

Регулярное выражение является расширенным регулярным выражением, а не полностью PCRE.

1
27.01.2020, 21:09

Теги

Похожие вопросы