linux - 如何将通过 vars 和 STDIN 插值构建的字符串附加到文件中?

标签 linux bash

有人可以帮我解决这个问题吗? 移动到存储库目录后,它应该复制版本日志文件进行备份 然后它会自动将作为输入给出的行以某种格式附加到日志文件中。 就是这样。

假设日志文件和测试目录存在。

#!/bin/bash

cd ~/Git/test
cp versionlog.MD .versionlog.MD.old
LOGDATE="$(date --utc +%m-%d-%Y)"
read -p "MSG > " VHMSG |
VHENTRY="- **${LOGDATE}** | ${VHMSG}"
cat ${VHENTRY} >> versionlog.MD

外壳输出

virufac@box:~/Git/test$ ~/.logvh.sh 
MSG > testing script


EOF
EOL]

EOL
e
E

CTRL + C 摆脱读取输入行的困境

virufac@box:~/Git/test$ cat versionlog.MD

直接输出markdown

# Version Log
## version 0.0.1 established 01-22-2020
*Working Towards Working Mission 1 Demo in 0.1 *
- **01-22-2020** | discovered faker.Faker and deprecated old namelessgen



EOF
EOL]

EOL
e
E

我终于把该死的输入行保存到文件中,而不是仅仅回显我想在屏幕上输入的命令而不执行它。但是...为什么它不添加从 VHENTRY 变量构建的行...以及为什么有时它不会在一行之后停止读取,而这次不是。您可以看到我正在尝试做一些事情来告诉它停止读取输入。

在意识到我在脚本中所做的事情是偶然的之后......我尝试修复它,发现读取命令末尾的 | 似乎是脚本首先执行保存到文件的任何操作的唯一原因。

如果我知道这个脚本不是我做过的最简单的事情,我就会在 python3 中完成此操作。现在我只需要知道在花了这么多时间之后你是如何做到的,这样我就可以记住永远不要再认为 shell 脚本会节省时间。

最佳答案

使用printf将字符串写入文件。 cat 尝试从参数列表中指定的文件中读取数据。当参数为 - 时,表示从标准输入读取直到 EOF。因此您的脚本挂起,因为它正在等待您输入所有输入。

当路径以 ~ 开头时,请勿在路径周围添加引号,因为引号使其成为文字而不是扩展到主目录。

去掉read行末尾的|read 不会向标准输出写入任何内容,因此没有任何内容可以通过管道传输到以下命令。

实际上并不需要 VHENTRY 变量,您可以在 printf 参数中进行格式化。

#!/bin/bash

cd ~/Git/test
cp versionlog.MD .versionlog.MD.old
LOGDATE="$(date --utc +%m-%d-%Y)"
read -p "MSG > " VHMSG
printf -- '- **%s** | %s\n' "${LOGDATE}" "$VHMSG" >> versionlog.MD

关于linux - 如何将通过 vars 和 STDIN 插值构建的字符串附加到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59870624/

相关文章:

linux - 为什么我不能执行这个脚本?

linux - 使用 bash 部署 postgresql - 语法错误

linux - 为什么我检查端口占用时命令失败?

python Popen.wait() 在多个管道上死锁 - 为什么?

Linux 内核线程 - 调度程序

linux - 获取第4层桥下真实的net_device

arrays - 将 find 命令的输出存储在数组中

linux - Docker 注册表登录文件在哪里?

c - linux下使用C语言读取串口

linux - 如何使用 ed 在最后一次模式匹配后添加文本