Bash

由於空格導致的全域錯誤

  • May 3, 2016

我的目錄變數

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

我的 for 聲明:

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

似乎“無標題文件夾”中的空白與萬用字元混淆了。我懷疑這是因為 file0 最終是“/無標題”。請注意,我有“shopt -s extglob”。

它並沒有真正搞亂 globbing。在這裡,通過使用$POSTMAPunquoted,您使用的是 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 的 shell 中),它可以用於轉義萬用字元 glob 運算符)。

所以要麼:

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

或者在這裡使用支持數組的 shell 可能會更好,如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....

引用自:https://unix.stackexchange.com/questions/264299