从用户获取包含空格的路径(bash脚本)
从用户获取包含空格的路径(bash脚本)
我需要提示用户输入一个文件夹路径,将该文件夹从服务器复制到我的计算机上。
由于我知道文件夹名称中有一个空格(不幸的是不能省略),所以我试图让它工作,但是我做不到。
目前我有以下代码:
#copy.sh read -r -p "请输入日期: " plot_date scp -r user@server:/home/user/Documents/projects/pages/$plot_date Plots/
我知道plot_date
的格式是yyyy-mm-dd hh.mm
,例如2021-09-06 10.51
,但是它不起作用,例如:
./copy.sh 请输入日期: 2021-09-06 10.51 user@server's password: ******* scp: /home/user/Documents/projects/pages/2021-09-06: 没有那个文件或目录 cp: 无法获取文件状态'17.10': 没有那个文件或目录
看起来好像它将日期和小时分开了。
我尝试了一些双引号的方法,参考了这个 SO答案,即
#copy.sh read -r -p "请输入日期: " plot_date scp -r user@server:/home/user/Documents/projects/pages/"$plot_date" Plots/
它几乎抛出了相同的错误
scp: /home/user/Documents/projects/pages/2021-09-06: 没有那个文件或目录 scp: 17.10: 没有那个文件或目录
我尝试将输入保存到另一个变量中并使用它(以避免路径中的字符串)
read -r -p "请输入日期: " plot_date p_date="$plot_date" scp -r user@server:/home/user/Documents/projects/pages/$p_date Plots/
它抛出与上面完全相同的错误。
最后我尝试将整个路径放入一个字符串中,即
read -r -p "请输入日期: " plot_date p_date="$plot_date" scp -r "user@server:/home/user/Documents/projects/pages/$plot_date" Plots/
它抛出与最后两个错误相同的错误。
现在我真的没有更多尝试的了
编辑:
此处的答案是关于用户输入的,强制用户以2021-09-09\ 17\.51
的格式输入。我希望在脚本中处理,即使用户只需输入2021-09-06 17.51
。
原因:这个问题的出现是因为在使用bash脚本时,如果用户输入的路径中包含空格,bash会将空格视为分隔符,导致无法正确识别路径。
解决方法:可以使用参数扩展的方式来解决这个问题。首先使用read
命令获取用户输入的路径,然后在scp
命令中使用${parameter}
来引用用户输入的路径,这样就可以正确处理包含空格的路径。具体的解决方法如下:
read -r -p "Plot date: " plot_date scp -r user:/home/user/Documents/projects/pages/"${plot_date}" Plots/
在这个解决方法中,${plot_date}
是用户输入的路径,使用双引号将其引起来可以确保bash将其作为一个整体来处理,而不会将其中的空格视为分隔符。
通过这种方式,就可以实现从用户获取包含空格的路径,并在bash脚本中正确处理这样的路径。