将文件复制/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 ...
$