Globbing-Fehler aufgrund von Leerzeichen

Globbing-Fehler aufgrund von Leerzeichen

Meine Verzeichnisvariable

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

Meine for-Aussage:

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

Es scheint, dass das Leerzeichen im „unbenannten Ordner“ das Globbing durcheinander bringt. Ich vermute das, weil file0 am Ende „/unbenannt“ ist. Beachten Sie, dass ich „shopt -s extglob“ habe.

Antwort1

Es ist nicht wirklichmit dem Globbing durcheinander bringen. Wenn Sie hier $POSTMAPkeine Anführungszeichen verwenden, verwenden Sie den Operator „Split+Glob“.

Mit dem Standardwert von wird $IFSIhr zuerst in , und aufgeteilt . Nur der dritte Teil enthält Platzhalterzeichen und unterliegt daher dem Glob-Teil. Der Glob würde jedoch nur im Verzeichnis relativ zum aktuellen Verzeichnis nach Dateien suchen./work/Documents/Projects/untitled\ folder/untitled\ folder/*/*_tsta.bam"/work/Documents/Projects/untitled\""folder/untitled\""folder/*/*_tsta.bam"folder

Wenn Sie nur den globTeil und nicht den splitdes split+globOperators möchten, setzen Sie es $IFSauf die leere Zeichenfolge. Für diesen Operator kann der Backslash nicht verwendet werden, um $IFSTrennzeichen zu maskieren (bei bash(und bashnur bei Bourne-ähnlichen Shells) kann er jedoch verwendet werden, um Platzhalter-Glob-Operatoren zu maskieren).

Also entweder:

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...

Oder hier wahrscheinlich besser mit Shells, die Arrays wie bash, yash, zsh, unterstützen 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....

verwandte Informationen