Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将使用vars和STDIN插值生成的字符串附加到文件中?_Linux_Bash - Fatal编程技术网

Linux 如何将使用vars和STDIN插值生成的字符串附加到文件中?

Linux 如何将使用vars和STDIN插值生成的字符串附加到文件中?,linux,bash,Linux,Bash,有人能帮我修一下吗。 它应该在移动到repo目录后将版本日志文件复制到备份 然后,它会自动将作为输入的行附加到日志文件中,并带有一些格式。 就这样 假设存在日志文件和测试目录 #/bin/bash cd~/Git/测试 cp versionlog.MD.versionlog.MD.old LOGDATE=“$(日期--utc+%m-%d-%Y)” 阅读-p“MSG>”VHMSG| VHENTRY=“-**${LOGDATE}**|${VHMSG}” cat${VHENTRY}>>versionl

有人能帮我修一下吗。 它应该在移动到repo目录后将版本日志文件复制到备份 然后,它会自动将作为输入的行附加到日志文件中,并带有一些格式。 就这样

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

#/bin/bash
cd~/Git/测试
cp versionlog.MD.versionlog.MD.old
LOGDATE=“$(日期--utc+%m-%d-%Y)”
阅读-p“MSG>”VHMSG|
VHENTRY=“-**${LOGDATE}**|${VHMSG}”
cat${VHENTRY}>>versionlog.MD
外壳输出

virufac@box:~/Git/test$~/.logvh.sh
MSG>测试脚本
EOF
EOL]
下线
E
E
CTRL+C组合键,以摆脱陷入阅读输入行的困境

virufac@box:~/Git/test$cat versionlog.MD
直接输出降价

# 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变量生成的行。。。为什么有时一行之后它不停止阅读,而这次不是。你可以看到我试图做一些事情来告诉它停止读取输入

在意识到我在剧本中做的一件事是偶然的之后。。。我试图修复它,发现read命令末尾的
|
似乎是脚本执行它最初保存到文件中的任何操作的唯一原因


如果我知道这个脚本不是我做过的最简单的事情,我会在python3中完成这项工作。现在我只需要知道在花了这么多时间之后你是怎么做的,这样我就不会再想shell脚本会节省时间了。

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

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

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

实际上不需要
vhtry
变量,您可以在
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

不要将
~
放在引号内,这样会阻止它扩展到主目录。
为什么不添加由VHENTRY变量构建的行呢?
-
read
在一行之后停止读取。但由于
vhcentry=“…”
部分是在子shell中执行的,因此导致
vhcentry
为空。所以
cat${vhtry}
变成了
cat
,并且
cat
正在阅读您键入的内容。如果要
cat“${vhtry}”
cat
将打印一条错误消息。使用
set-x
调试shell脚本。@Barmar谢谢。我不知道我为什么把它放在那里。我意识到了这一点,将其删除,再次测试,并认为我粘贴了正确的输出。所以问题仍然存在。@KamilCuk哇,你帮助我明白,在我尝试在bash中编写这样的脚本之前,我还有很多东西要学。谢谢。我得到了``$~/.logvh.sh MSG>testi/home/virufac/.logvh.sh:第7行:printf:-:无效选项printf:用法:printf[-v var]格式[参数]``在
printf
中添加了一个
--
选项,这样它就不会把格式字符串当作一个选项了。我很惊讶,它考虑了这么多事情,而且在某些方面比我现在尝试的要简单得多。