名称中有空格时,如何从一个目录复制到另一个目录?

时间:2019-07-12 22:12:50

标签: bash escaping

当这些参数中有空格时,我试图弄清楚如何处理bash脚本的参数。

要将这个问题归结为最简单的方法,请考虑使用提供的参数简单地执行ls的脚本...

#!/bin/bash
echo $1
ls $1

请考虑以下文件夹结构:

enter image description here

当我使用没有空格的文件夹运行它时,它会起作用:

$ ./my_ls.sh ~/Documents/Temp/Foo
/Users/user_name/Documents/Temp/Foo
Test

当我尝试对带有空格的文件夹执行相同操作时,出现一些错误:

$ ./my_ls.sh "~/Documents/Temp/Bar Baz"
~/Documents/Temp/Bar Baz
ls: Baz: No such file or directory
ls: ~/Documents/Temp/Bar: No such file or directory

我尝试使用反斜杠,但无济于事:

$ ./my_ls.sh ~/Documents/Temp/Bar\ Baz
/Users/user_name/Documents/Temp/Bar Baz
ls: /Users/user_name/Documents/Temp/Bar: No such file or directory
ls: Baz: No such file or directory

当文件夹/文件名中有空格时,该如何指代?


我发现修复脚本的一种方法是使用引号:

#!/bin/bash
echo $1
ls "$1"

...,并且在运行脚本时,请使用反斜杠转义(而不是引号)。

但是,这似乎违反直觉,因为如果我们知道反斜杠是运行脚本(./my_ls.sh ~/Documents/Temp/Bar\ Baz)的方式,为什么我在运行lsls "$1"时使用引号?这些似乎在这里应该是一致的。我想念什么?在处理用户提供的参数时是否有一般的最佳做法(例如,始终假定他们使用反斜杠引号,并且引用目录的参数中可能有空格)?


更奇怪的是,当我通过命令行在ls中使用引号时,它会失败:

$ ls "~/Documents/Temp/Bar Baz"
ls: ~/Documents/Temp/Bar Baz: No such file or directory

那么,为什么要在bash脚本中添加引号呢?

0 个答案:

没有答案