Скрипт работает с вводом файла, но не с stdin - PullRequest
0 голосов
/ 28 сентября 2018

это действительно меня озадачило.Вот что я пытаюсь сделать:

Я пытаюсь передать статью из newsboat в скрипт.Этот скрипт должен затем извлечь заголовок и URL из статьи.

Вот пример статьи:

Feed: NYT > Home Page
Title: Hit Pause on Brett Kavanaugh
Author: THE EDITORIAL BOARD
Link: https://www.nytimes.com/2018/09/26/opinion/kavanaugh-supreme-court-hearing-delay.html?partner=rss&emc=rss
Date: Thu, 27 Sep 2018 01:58:11 +0200

The integrity of the Supreme Court is at stake.

Статья получает макрос с новостной шлюпкой:

macro R pipe-to "cat | ~/.scripts/newsboat_extract"  

Вот рабочий скрипт:

#!/bin/bash

cat > ~/newsboat         #I do not really need this file, so if I can cut out saving to a file, I would prefer to

title="$(awk -F: '/^Title:/{for(i=2;i<=NF;++i)print $i}' ~/newsboat)"
url="$(awk -F: '/^Link:/{print $2 ":" $3}' ~/newsboat)"
printf '%s\n' "$title" "$url" >> newsboat_result

Это обеспечивает ожидаемый результат:

Hit Pause on Brett Kavanaugh
https://www.nytimes.com/2018/09/26/opinion/kavanaugh-supreme-court-hearing-delay.html?partner=rss&emc=rss

Я хотел бы избежать сохранения в файл.Однако сохранение в переменную по какой-то причине не работает: и этот сценарий не работает!

#!/bin/bash

article=$(cat)

title="$(awk -F: '/^Title:/{for(i=2;i<=NF;++i)print $i}' "$article")"
url="$(awk -F: '/^Link:/{print $2 ":" $3}' "$article")"
printf '%s\n' "$title" "$url" >> newsboat_result

вывод превращается в следующее:

#empty line
#empty line

Iпонятия не имею, почему скрипт будет вести себя так.Должно быть что-то, что делает, как хранится переменная, верно?

Есть идеи?- Я довольно новичок в bash-скриптинге и awk, так что благодарен также за любые комментарии о том, как решить эту проблему более эффективно.

"" "" "" "" "" "" SOLUTION "" """" "" "" "" "

Это было сделано, спасибо!

#!/bin/bash

article=$(cat "${1:--}")

title="$(awk -F: '/^Title:/{for(i=2;i<=NF;++i)print $i}' <<< "$article")"
url="$(awk -F: '/^Link:/{print $2 ":" $3}' <<< "$article")"
printf '%s\n' "$title" "$url" >> newsboat_result

1 Ответ

0 голосов
/ 28 сентября 2018

В вашем скрипте вы предполагаете, что $ARTICLE - это простой файл, и вы выполняете над ним несколько операций.Сначала вы читаете его с помощью cat и сохраняете содержимое в ~/newsboat, затем снова читаете его с помощью awk, чтобы извлечь заголовок, а затем читаете его в третий раз, чтобы извлечь URL.

Это не может работатьсо стандартным вводом;он может быть прочитан только один раз.

Быстрое исправление - это работа с копией, сделанной вами в первой операции:

#!/bin/bash

article=$1
feed_copy=~/newsboat
cat "${article:--}" > "$feed_copy"     # Use stdin if parameter is not provided

title="$(awk -F: '/^Title:/ { for(i=2; i<=NF; ++i) print $i }' "$feed_copy")"
url="$(awk -F: '/^Link:/ { print $2 ":" $3 }' "$feed_copy")"

printf '%s\n' "$title" "$url" >> "$feed_copy"

Не проверено, очевидно, но это должно сработать.

Примечания:

  • резервировать имена переменных в верхнем регистре для переменных среды (это просто соглашение)
  • вы почти всегда должны заключать в кавычки свои переменные (cat "$article", а неcat $article) если вы не знаете, что делаете
  • избегайте echo, используйте printf

В этот скрипт можно внести другие улучшения, но извините, яне хватает времени.


[править] Поскольку вам на самом деле не нужен файл ~/newsboat, вот обновленная версия, которая следует предложению Чарльза Даффи:

#!/bin/bash

feed_copy=$(cat "${1:--}")
title="$(awk -F: '/^Title:/ { for(i=2; i<=NF; ++i) print $i }' <<< "$feed_copy")"
url="$(awk -F: '/^Link:/ {print $2 ":" $3}' <<< "$feed_copy")"
printf '%s\n' "$title" "$url"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...