目录名称中的空格崩溃.sh - 使用" usebackq"?

时间:2014-09-21 06:52:18

标签: bash unix directory space git-bash

dir1='/d/Dropbox/PhD/Experimental Design/APS/Processed_and_Graphed/InvariantQ'
echo $dir1

for f in A*.xlsx
do
   str2=${f%?????}
   if [[ ! -d $dir1/$str2 ]]; then
      mkdir $dir1/$str2
   else
      echo "Directory" $dir1/$str2 "already exists, directory not created"
   fi
   if [[ ! -f $dir1/$str2/$f ]]; then
      mv -v $f $dir1/$str2
   else
      echo "File" $dir1/$str2/$f "already exists, file not copied"
   fi
done

我试图让以下脚本运行,但是当它尝试使用mkdir $ dir1 / $ str2时,它会创建:

/ d /升降梭箱/博士/实验

并返回错误:

创建目录' / d / Dropbox / PhD / Experimental':文件存在

创建目录' Design / APS / Processed_and_Graphed / InvariantQ':没有这样的文件或目录

我尝试使用双引号对目录名进行编码,或者使用' \'在“实验设计”中的空间前面,但这两种方法似乎都不起作用......看来这可以在批处理文件中使用" usebackq" - 有没有办法在GitBash for Windows中这样做?如果是这样,我的代码将在何处应用?

此外,是否有人知道为什么在这里使用" [["工作,而单一的" ["没有按'?吨

1 个答案:

答案 0 :(得分:1)

引用你的变量以防止在扩展上分词。

dir1='/d/Dropbox/PhD/Experimental Design/APS/Processed_and_Graphed/InvariantQ'
echo "$dir1"

for f in A*.xlsx
do
   str2=${f%?????}
   if [[ ! -d $dir1/$str2 ]]; then
      mkdir "$dir1/$str2"
   else
      echo "Directory $dir1/$str2 already exists, directory not created"
   fi
   if [[ ! -f $dir1/$str2/$f ]]; then
      mv -v "$f" "$dir1/$str2"
   else
      echo "File $dir1/$str2/$f already exists, file not copied"
   fi
done

它适用于[[,因为这是shell语法,而不是普通的命令。它专门识别变量,不会分裂它们。这与允许您在不引用它们的情况下使用<等运算符的原因相同。