从用户获取包含空格的路径(bash脚本)

14 浏览
0 Comments

从用户获取包含空格的路径(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

0
0 Comments

原因:这个问题的出现是因为在使用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脚本中正确处理这样的路径。

0