如何在 Bash 脚本中将文件复制到包含空格的路径?

如何在 Bash 脚本中将文件复制到包含空格的路径?

将文件复制/tmp/template.txt到 中指定的任何目录的示例脚本$1

复制脚本.sh

if [ $# -eq 0 ]; then
    echo No Argument
    echo "Usage: $0 <path>"
else
    cp /tmp/template.txt $1
fi

wolf@linux:~$ ls -lh
total 4.0K
drwxrwxr-x 2 wolf wolf 4.0K Dis  31 10:08 'another directory'
wolf@linux:~$ 

测试脚本

wolf@linux:~$ copy_script.sh 
No Argument
Usage: /home/wolf/bin/copy_script.sh <path>
wolf@linux:~$ 

使用当前路径测试代码

wolf@linux:~$ copy_script.sh .

之后(有效)

wolf@linux:~$ ls -lh
total 8.0K
drwxrwxr-x 2 wolf wolf 4.0K Dis  31 10:08 'another directory'
-rw-rw-r-- 1 wolf wolf   12 Dis  31 10:26  template.txt
wolf@linux:~$ 

然后,我使用另一个有空间的目录进行测试。

这次,即使目录已被引用(单引号/双引号都不起作用),它也不再起作用了。

wolf@linux:~$ copy_script.sh 'another directory'
cp: target 'directory' is not a directory
wolf@linux:~$ 
wolf@linux:~$ ls -lh another\ directory/
total 0
wolf@linux:~$ 

如何使其与包含空格的目录名一起使用?

答案1

正如上面评论中提到的,请始终引用您的参数扩展。

cp /tmp/template.txt "$1"

你可以在这里读更多关于它的内容。

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html https://wiki.bash-hackers.org/syntax/pe

完整代码

if [ $# -eq 0 ]; then
    echo No Argument
    echo "Usage: $0 <path>"
else
    cp /tmp/template.txt "$1"
fi

这应该可以解决您的空格问题。

您可能还想检查shellcheck脚本。识别这样的问题非常有用。

$ shellcheck script.sh 

In script.sh line 1:
if [ $# -eq 0 ]; then
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.


In script.sh line 5:
    cp /tmp/template.txt $1
                         ^-- SC2086: Double quote to prevent globbing and word splitting.

Did you mean: 
    cp /tmp/template.txt "$1"

For more information:
  https://www.shellcheck.net/wiki/SC2148 -- Tips depend on target shell and y...
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
$ 

相关内容