Shell脚本不会识别heredoc分隔符

我正在尝试在Linux中编写一个非常简单的shell脚本。 我试图达到的情景是:

创build一个用户帐户并在内部给它一个密码(不允许与用户交互)。 一旦成功,只需向用户显示成功消息。 其余的都不应该显示。

在RHEL上,事实certificate这很简单,因为passwd命令接受了帮助我通过Pipe传递input的–stdin选项。 我redirect到一个日志文件的标准输出。 [不要分享这个代码,因为它很简单,在StackExcahnge的不同问题上多次解释]

但是,Ubuntu不接受passwd的–stdin选项,因此我不得不使用下面的方法:

#!/bin/bash useradd -m demo &>path/to/logfile.log passwd demo &>>path/to/logfile.log << EOF myPasswd myPasswd EOF echo "User demo successfully added to the system." 

现在这里的问题是我的输出不打印回显语句,也显示一个警告:

 root@ubuntu:~# ./usercreate.sh ./usercreate.sh: line 8: warning: here-document at line 3 delimited by end-of-file (wanted `EOF') root@ubuntu:~# 

而不是我预期的一个:

 root@ubuntu:~# ./usercreate.sh User demo successfully added to the system. root@ubuntu:~# 

请帮助我这两件事情:

  1. 有没有办法只压制这个脚本的警告?
  2. 为什么不打印我的echo语句,如何打印?

PS:写这个脚本的另一种方法或想法也是受欢迎的

谢谢

当使用HEREDOC表示法时,必须将结束词( EOF在您的案例中)单独写成一行,而不用任何前导或尾随空格。

但在这种情况下,我会用另一种方法:

你可以使用chpasswd 。 这个命令是在所有的Linux发行版(我知道),我也认为在UNIX变种。

用法非常简单,只需通过STDIN username:password组合即可,这就是每行一个组合。 要更改单个用户的密码,只需执行一个简单的回显:

 echo "demo:myPasswd" | chpasswd