
Моя переменная каталога
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
разделителей ( хотя bash
(и bash
только среди оболочек типа 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....