【问题标题】:Output a files contents with a filename stored in a variable使用存储在变量中的文件名输出文件内容
【发布时间】:2016-10-03 15:26:08
【问题描述】:

我有一个脚本,它收集各种目录下的文件名,对它们进行 grep 查找特定模式,然后将该输出发送到另一个脚本。我在获取文件内容时遇到问题,要么一无所获,要么“没有这样的文件或目录错误”。文件名中可能有空格,所以我试过了:

1.

$FILENAME="cat $FILENAME"
echo $FILENAME | grep "pattern"

2.

FILENAME=$(printf %q "$FILENAME")
$(cat "$FILENAME") | grep "pattern"

3.

FILECONTENT=$(<"$FILENAME")
echo "$FILECONTENT" | grep "pattern"

但是这些以及我尝试过的所有这些组合似乎都不起作用,我总是在 grep 之前得到空文件内容。有人能指出我缺少什么吗?

【问题讨论】:

  • 你试过grep "pattern" "$FILENAME"吗?

标签: bash file cat


【解决方案1】:
$FILENAME="cat $FILENAME"
echo $FILENAME | grep "pattern"

错了,因为我们通过省略“$”前缀来设置变量。此外,您需要将FILENAME 变量设置为字符串CAT $FILENAME。而是:

FILENAME=$(cat $FILENAME)
echo $FILENAME | grep "pattern"

但是在下一个名称中,您将使用 grepping 文件的内容,无需将文件的内容存储在其自己的变量中即可完成,只需:

grep "pattern" "$FILENAME"

第二次尝试:

FILENAME=$(printf %q "$FILENAME")
$(cat "$FILENAME") | grep "pattern"

出于某种原因,您将变量存储回自身。然后你将该文件的内容分类到 grep 中。这也是不必要的(参见上面的解决方案)。

最后,在你的最后一次尝试中:

FILECONTENT=$(<"$FILENAME")
echo "$FILECONTENT" | grep "pattern"

而不是 cat 将内容放入 FILECONTENT 变量中,您使用了重定向。无论哪种方式都是多余的,因为文件的内容不需要存储在变量中,它已经在文件本身中。您的第二行是正确的,但我怀疑重定向在第一行失败,所以它是一个洗涤。

【讨论】:

    【解决方案2】:

    文件名开头是否正确可能值得测试:

    [[ -f "$FILENAME" ]]
    

    会这样做。所以

    if [[ -f "$FILENAME" ]]; then
        grep "$pattern" "$FILENAME"
    else
        echo "$FILENAME does not exist" >&2
    fi
    

    会让你知道发生了什么。当然,如果您使用grep "$pattern" "$FILENAME" 方法,grep 也会让您知道不存在的文件。这是一个关于你想控制多少错误条件的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多