【问题标题】:Shell script won't recognize heredoc delimiterShell 脚本无法识别 heredoc 分隔符
【发布时间】:2015-02-27 06:25:43
【问题描述】:

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

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

在 RHEL 上,这非常简单,因为 passwd 命令接受 --stdin 选项,它帮助我通过管道传递输入。我在日志文件中重定向了标准输出。 [不共享该代码,因为它有点简单,并在此处多次解释 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: 也欢迎使用其他方式或想法来编写此脚本

谢谢

【问题讨论】:

  • 就像错误消息说的那样,你使用了EOD,你认为你有EOF。您在转录代码时似乎已经纠正了这个错误——也许下次,使用复制+粘贴来确保您确实向我们展示了您的确切代码。
  • 交换&amp;&gt;&gt;path/to/logfile.log&lt;&lt; EOF
  • 但我认为您的解决方法尝试不会奏效——标准输入也会收到此处的文档。
  • 关闭EOF后还有空格吗?它应该是该行中唯一的单词,没有前导或尾随空格。
  • @tripleee 感谢您提供更贴切的标题 :)

标签: linux bash shell ubuntu


【解决方案1】:

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

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

您可以使用chpasswd。这个命令在所有 linux 发行版(据我所知)中都有,我认为在 UNIX 变体中也是如此。

用法非常简单,您只需通过 STDIN 传递一个 username:password 组合,仅此而已,每行一个组合。要更改单个用户的密码,只需执行简单的 echo:

echo "demo:myPasswd" | chpasswd

【讨论】:

  • 谢谢!成功了。实际上 chpasswd 被证明更有帮助,因为我需要在各种发行版中运行我的脚本并且需要一个统一的发行版!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2014-04-23
相关资源
最近更新 更多