Назад | Перейти на главную страницу

Расширение подстановочных знаков Bash (2)

Прошу прощения, если это слишком просто или было рассмотрено ранее ... но я надеюсь, что кто-то здесь может помочь. Я не могу понять, как расширить подстановочный знак * в имени пути, если за ним не следует пробел. Например,

echo $path* $dir

дает

/Data0001 /subfolder 

что я хочу, но без места. Если я попытаюсь убрать пространство с помощью,

echo $path*$dir

Я получил,

/Data*/subfolder

Любые советы о том, как заставить * расширяться без пробелов?

Спасибо.

Поместите имя (имена) переменных в фигурные скобки, например:

echo ${path}*${dir}

Он выполняет сопоставление с образцом для всего слова, а не только для ${path}* часть - поэтому, если $ path был "/", а $ dir был "/ subdirname", он будет искать совпадения с /*/subdirname, который, по сути, ищет каталоги в /, содержащие подкаталоги с именем subdirname. Если вы хотите, чтобы он находил каталоги, которые еще не содержат / subdirname, вы должны оставить это вне шаблона и добавить его позже. Вот пример, в котором совпадения сохраняются в массиве, а затем добавляется подкаталог:

path="/"
dir="/subdirname"
matchedDirs=("$path"*)
echo "${matchedDirs[@]/%/$dir}"

Если эту последнюю конструкцию трудно разобрать, то [@] часть означает «все элементы массива, каждый из которых рассматривается как отдельное слово», и /%/$dir означает «заменить конец (каждого элемента) на $ dir» (т.е. добавить $ dir к каждому элементу массива).

Измените это на

dir=/Data sub=subfolder
echo $dir*/$sub

.

dir=/Data* sub=subfolder
echo $dir/$sub

также будет работать