Bash-复制文件或目录的读取响应

Bash-复制文件或目录的读取响应,bash,shell,Bash,Shell,我正在尝试编写一个shell脚本,根据用户响应复制一个文件。我正在尝试做的一个例子: #!/bin/bash echo "What is the name of the user?: " read RESPONSE cp /home/$RESPONSE/file.txt /home/$RESPONSE/backup/file_backup.txt 但是,我的copy命令似乎没有正确地接受read变量。 我做错了什么?我发现了问题所在。我有一些命令在中间,然后有第二个读取响应命令,这不是必需的。

我正在尝试编写一个shell脚本,根据用户响应复制一个文件。我正在尝试做的一个例子:

#!/bin/bash
echo "What is the name of the user?: "
read RESPONSE
cp /home/$RESPONSE/file.txt /home/$RESPONSE/backup/file_backup.txt
但是,我的copy命令似乎没有正确地接受read变量。
我做错了什么?

我发现了问题所在。我有一些命令在中间,然后有第二个读取响应命令,这不是必需的。换句话说,作为一个例子,我有:

#!/bin/bash
echo "What is the name of the user?: "
read RESPONSE
rsync -a /home/$RESPONSE /backup
read RESPONSE
cp /home/$RESPONSE/file.txt /home/$RESPONSE/backup/file_backup.txt
另外,@GeorgeVasiliou说得对,我还需要在引号中加上它。因此,有效的方法是:

#!/bin/bash
echo "What is the name of the user?: "
read response
rsync -a "/home/$response/" /backup
cp "/home/$response/file.txt" "/home/$response/backup/file_backup.txt"

我解决了这个问题。我有一些命令在中间,然后有第二个读取响应命令,这不是必需的。换句话说,作为一个例子,我有:

#!/bin/bash
echo "What is the name of the user?: "
read RESPONSE
rsync -a /home/$RESPONSE /backup
read RESPONSE
cp /home/$RESPONSE/file.txt /home/$RESPONSE/backup/file_backup.txt
另外,@GeorgeVasiliou说得对,我还需要在引号中加上它。因此,有效的方法是:

#!/bin/bash
echo "What is the name of the user?: "
read response
rsync -a "/home/$response/" /backup
cp "/home/$response/file.txt" "/home/$response/backup/file_backup.txt"

下面的代码实现了您想要的功能。它还检查用户是否存在,以及用户在尝试保存文件之前是否创建了/backup/文件夹(如果用户不存在,则/home/user/…也不应存在,脚本将失败)


编辑:对上述代码进行了编辑,以添加一些改进。

以下代码实现了您想要的功能。它还检查用户是否存在,以及用户在尝试保存文件之前是否创建了/backup/文件夹(如果用户不存在,则/home/user/…也不应存在,脚本将失败)


编辑:编辑上面的代码是为了添加一些改进。

到底出了什么问题?如果用户名中有空格、反斜杠或可以作为glob计算,那么错误是非常明显的,但是您需要更具体地了解观察到的确切行为。“似乎不接受”——你怎么知道?什么是精确的输入,以及输出中的确切错误?考虑运行<代码> BASH-X YuScript < /Cord>,以记录调用的命令运行它。此外,运行它,并修复发现的内容(在这里询问shell问题之前,这是一个很好的建议)。此外,不要对自己的变量使用所有大写名称!所有caps名称都由对操作系统或shell有意义的变量使用;使用小写名称可以避免错误地踩到这些名称。请参阅第4段(是的,它正在讨论环境变量,但设置一个常规shell变量将覆盖一个类似命名的环境变量,因此该约定适用于这两个地方)。@geogevasiliou,nod——这就是我将OP指向shellcheck的原因。(最好让他们养成在那里检查的习惯,而不是需要得到人的指导)。你说你发布的代码是“你正在尝试做的事情的一个例子”。这是否意味着您实际运行的代码不同?如果是这样,请发布您遇到问题的实际代码。如果您想缩写/简化/修订,请确保您的简化版本在发布之前仍然显示问题。到底是什么问题?如果用户名中有空格、反斜杠或可以作为glob计算,那么错误是非常明显的,但是您需要更具体地了解观察到的确切行为。“似乎不接受”——你怎么知道?什么是精确的输入,以及输出中的确切错误?考虑运行<代码> BASH-X YuScript < /Cord>,以记录调用的命令运行它。此外,运行它,并修复发现的内容(在这里询问shell问题之前,这是一个很好的建议)。此外,不要对自己的变量使用所有大写名称!所有caps名称都由对操作系统或shell有意义的变量使用;使用小写名称可以避免错误地踩到这些名称。请参阅第4段(是的,它正在讨论环境变量,但设置一个常规shell变量将覆盖一个类似命名的环境变量,因此该约定适用于这两个地方)。@geogevasiliou,nod——这就是我将OP指向shellcheck的原因。(最好让他们养成在那里检查的习惯,而不是需要得到人的指导)。你说你发布的代码是“你正在尝试做的事情的一个例子”。这是否意味着您实际运行的代码不同?如果是这样,请发布您遇到问题的实际代码。如果要缩写/简化/修订,请确保简化版本在发布之前仍显示问题。最好在运行脚本之前检查脚本是否存在用户和备份文件夹。查看我的答案。以后,请确保检查问题中的简化代码是否与您试图为其创建复制程序的实际程序存在相同的问题。如果用户和备份文件夹存在或不存在,则最好先检查脚本,然后再运行脚本。请看我的答案。以后,请务必检查问题中的简化代码是否与您试图为.Nice创建复制程序的实际程序存在相同的问题。我喜欢。谢谢。我建议使用
getentpasswd
,而不是直接引用
/etc/passwd
——这样一来,这将支持使用NIS、LDAP或其他目录服务的系统,而不仅仅限于本地文件身份验证。您还可以显式地为错误案例提供非零退出状态。(相比之下,在非错误的情况下,以最后一个命令的状态退出的默认行为--
cp
--可能是正确的;通过输入显式的
exit 0
,即使
cp
失败,您也可以成功退出状态)。谢谢Charles!我喜欢getent,我以前从未听说过它。另外,最后的
exit
不应该设置为零——我为非常初学者的用户开发了很多东西(初学者不知道如何双击!),我通常会使代码尽可能保持沉默,所以这只是习惯,但在这里定期
exit
要好得多。我修正了我的答案,很好。我喜欢。谢谢,我建议你