Ошибка подстановки из-за пробелов

Ошибка подстановки из-за пробелов

Моя переменная каталога

POSTMAP="/work/Documents/Projects/untitled\ folder/untitled\ folder/*/*_tsta.bam"

Мое утверждение for:

for file0 in ${POSTMAP}; do
...

Кажется, пробел в 'untitled folder' портит подстановку. Я подозреваю это, потому что file0 в итоге становится '/untitled'. Обратите внимание, что у меня есть 'shopt -s extglob'.

решение1

Это не совсем такпутаница с подстановкой. Здесь, используя $POSTMAPбез кавычек, вы используете оператор split+glob.

При значении по умолчанию $IFS, на вашем /work/Documents/Projects/untitled\ folder/untitled\ folder/*/*_tsta.bam, он сначала разделит его на "/work/Documents/Projects/untitled\", "folder/untitled\"и "folder/*/*_tsta.bam". Только третий содержит подстановочные знаки и, таким образом, подлежит части glob. Однако glob будет просто искать файлы в каталоге folderотносительно текущего каталога.

Если вам нужна только часть glob, а не splitэтого split+globоператора, установите $IFSпустую строку. Для этого оператора обратная косая черта не может использоваться для экранирования $IFSразделителей ( хотя bashbashтолько среди оболочек типа Bourne) ее можно использовать для экранирования операторов подстановочных знаков).

Итак, либо:

POSTMAP="/work/Documents/Projects/untitled folder/untitled folder/*/*_tsta.bam"
IFS=   # don't split
set +f # do glob
for file0 in $POSTMAP # invoke the split+glob operator
do...

Или, возможно, лучше здесь с оболочками, поддерживающими массивы вроде bash, yash, zsh, ksh:

postmap=(
  '/work/Documents/Projects/untitled folder/untitled folder/'*/*_tsta.bam
) # expand the glob at the time of that array assignment
for file0 in "${postmap[@]}" # loop over the array elements
do....

Связанный контент