Bash脚本如何处理含空格用户输入路径完成SCP文件夹跨服务器传输
问题原因
你遇到的报错本质是scp的参数会经历两次shell解析:
- 第一次是本地运行脚本的shell做解析,你加的单层双引号只能避免本地阶段的路径分词
- 第二次是远程服务器的shell会对收到的路径再做一次分词,此时路径里的空格没有被包裹/转义,就会被拆成两个独立路径
解决方案
方案1:两层引号嵌套(适配你的固定场景)
直接在变量外层再加一层单引号,让远程端shell识别到空格属于路径的一部分:
# copy.sh read -r -p "Plot date: " plot_date scp -r "user@server:/home/user/Documents/projects/pages/'$plot_date'" Plots/
方案2:自动转义特殊字符(通用兼容性更强)
如果文件夹名可能包含引号、感叹号等其他特殊字符,用printf %q自动转义所有特殊字符更稳妥:
# copy.sh read -r -p "Plot date: " plot_date printf -v escaped_date '%q' "$plot_date" scp -r "user@server:/home/user/Documents/projects/pages/$escaped_date" Plots/
两种方案都不需要用户手动输入转义符,正常输入yyyy-mm-dd hh.mm格式的内容即可正常运行。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

