Macos 处理数组中带有空格的文件和目录列表

Macos 处理数组中带有空格的文件和目录列表,macos,bash,Macos,Bash,如何最好地处理阵列中文件和目录的混合。我需要创建一个文件和文件夹数组,并在该数组中循环,并使用-rf选项使数组中的每个项都服从rm命令: #Build array of files to be deleted FILES=( "~/Library/Preferences/Adobe InDesign" "~/Library/Caches/Adobe InDesign" "~/Library/Saved Application State/com.adobe.InDesign.savedstat

如何最好地处理阵列中文件和目录的混合。我需要创建一个文件和文件夹数组,并在该数组中循环,并使用-rf选项使数组中的每个项都服从rm命令:

#Build array of files to be deleted

FILES=(
"~/Library/Preferences/Adobe InDesign"
"~/Library/Caches/Adobe InDesign"
"~/Library/Saved Application State/com.adobe.InDesign.savedstate"
)


#Loop through array deleting each file/directory with the recursive force options

    for i in "${FILES[@]}"

      do

        rm -rf "$i"

      done

    exit

我有时会使用这个技巧:

with_expanded_paths()
{
  typeset IFS
  IFS=""
  "$@"
}
with_expanded_paths rm -rf "~/file with spaces"

我是从内存写的,所以可能需要稍微调整。

问题不在于数组或空格,而在于文件路径中的
~
<代码>~实际上不是路径的有效部分,但shell将用主目录的路径替换它。。。除非在引号中:

$ echo ~/Library/Preferences/Adobe InDesign
/Users/gordon/Library/Preferences/Adobe InDesign
$ echo "~/Library/Preferences/Adobe InDesign"
~/Library/Preferences/Adobe InDesign
因此,您可以将
~
置于引号之外:

FILES=(
~/"Library/Preferences/Adobe InDesign"
~/"Library/Caches/Adobe InDesign"
~/"Library/Saved Application State/com.adobe.InDesign.savedstate"
)
或者使用$HOME(以双引号替换):


使用shell“debugger”
set-vx
将向您显示命令的处理方式。我打赌您不希望在
${FILES[@]}
周围使用dbl引号。祝你好运。实际上这段代码应该可以工作,你从中得到任何错误吗?@mpapis它执行时没有错误。我使用了Shelleter的方法进行调试…解析变量名中的空白并没有什么好玩的…但它不会删除文件?我觉得我快要失去理智了。我还验证了权限,甚至创建了一个名为“test”的新文件夹和一个名为“testfile”的新文件,它也不会删除它们。暂时关闭调试,在
rm
前面添加
echo
,然后用输出编辑您的帖子?失去理智,那不好。哦,嘿,昨天我有一个疯狂的地方,我导入了一个带有\r\n(DOS)行结尾的shell脚本,
vim
没有显示我所期望的
^M
,结果完全令人迷惑
cat-vet myScript
以消除这种可能性。祝你好运。真不敢相信我没有意识到外壳没有膨胀,因为它被引用了。谢谢你抓到这个。很好的解释。
FILES=(
"$HOME/Library/Preferences/Adobe InDesign"
"$HOME/Library/Caches/Adobe InDesign"
"$HOME/Library/Saved Application State/com.adobe.InDesign.savedstate"
)