脚本适用于文件输入,但不适用于标准输入



这真的让我感到困惑。这是我正在尝试做的:

我尝试将一篇文章从新闻船上输送到脚本。然后,此脚本应从文章中提取标题和 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 '%sn' "$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 '%sn' "$title" "$url" >> newsboat_result

输出变为:

#empty line
#empty line

我完全不知道为什么脚本会这样。它一定与变量的存储方式有关,对吧?

有什么想法吗? - 我在 bash 脚本和 awk 方面很陌生,所以也非常感谢关于如何更有效地解决这个问题的任何评论。

" " 解决方案 " """""""""""">

做到了,谢谢!

#!/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 '%sn' "$title" "$url" >> newsboat_result

在您的脚本中,您假设$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 '%sn' "$title" "$url" >> "$feed_copy"

显然没有经过测试,但这应该有效。

笔记:

  • 为环境变量保留大写变量名称(这只是一个约定(
  • 你几乎总是应该引用你的变量(cat "$article",而不是cat $article(,除非你知道你在做什么
  • 避免echo,使用printf

可以对此脚本进行其他增强,但抱歉,我没有时间。


[编辑] 由于您实际上并不需要~/newsboat文件,因此以下是遵循Charles Duffy建议的更新版本:

#!/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 '%sn' "$title" "$url"

最新更新