Как вы добавляете строку, построенную с интерполяцией Vars и STDIN в файл? - PullRequest
0 голосов
/ 23 января 2020

Может кто-нибудь исправить это для меня. Он должен скопировать файл журнала версии в резервную копию после перемещения в каталог репозитория. Затем он автоматически добавляет строку, заданную в качестве входных данных, в файл журнала с некоторым форматированием. Вот и все.

Предположим, существует файл журнала и тестовый каталог.

#!/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

непосредственно выводят уценку

# 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, если бы у меня было знаю, что этот сценарий не будет самой простой вещью, которую я когда-либо делал. Теперь я просто должен знать, как вы делаете это после того, как на него потрачено время, чтобы я мог вспомнить, что никогда не думал, что скрипт оболочки снова сэкономит время.

1 Ответ

0 голосов
/ 23 января 2020

Используйте printf, чтобы записать строку в файл. cat пытается прочитать из файла, указанного в списке аргументов. И когда аргумент -, это означает чтение со стандартного ввода до EOF. Таким образом, ваш скрипт зависает, потому что он ждет, когда вы наберете все входные данные.

Не ставьте кавычки вокруг пути, когда он начинается с ~, так как кавычки делают его литералом, а не расширением до home directory.

Избавьтесь от | в конце строки read. read ничего не записывает в stdout, поэтому нет ничего, что можно передать по следующей команде.

На самом деле нет необходимости в переменной 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...