Shell脚本不会识别heredoc分隔符

时间:2015-02-27 06:25:44

标签: linux bash shell ubuntu

我正在尝试在Linux中编写一个非常简单的shell脚本。我想要实现的场景是:

创建用户帐户并在内部为其提供密码(不允许与用户进行交互)。成功后,只需向用户显示成功消息。其余的都不应该被显示出来。

在RHEL上,这很简单,因为passwd命令接受了--stdin选项,它帮助我通过Pipe传递输入。我将标准输出重定向到日志文件中。 [不分享该代码,因为它简单并且在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."

现在问题是我的输出没有打印echo语句并且还显示警告:

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语句以及如何打印它?
  3. PS:欢迎编写此脚本的另一种方式或想法

    由于

1 个答案:

答案 0 :(得分:1)

使用HEREDOC表示法时,您必须单独在一行中写下结束词(EOF),不带任何前导或尾随空格。

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

您可以使用chpasswd。这个命令包含在所有Linux发行版中(我知道),我认为在UNIX变种中也是如此。

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

echo "demo:myPasswd" | chpasswd