输出文件内容,文件名存储在变量中

Output a files contents with a filename stored in a variable

我有一个脚本可以收集不同目录下的文件名,根据特定模式对它们进行 greps,然后将该输出发送到另一个脚本。我在获取文件内容时遇到问题,要么一无所获,要么 "no such file or directory errors"。文件名中可能有空格,所以我试过:

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 之前得到空文件内容。有人能指出我遗漏了什么吗?

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

是错误的,因为我们通过省略 '$' 前缀来设置变量。此外,您会将 FILENAME 变量设置为字符串 CAT $FILENAME。相反:

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

但是在下一个名称中,您将获取文件的内容,这可以在不将文件内容存储在其自己的变量中的情况下完成,只需:

grep "pattern" "$FILENAME"

第二次尝试:

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

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

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

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

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

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

[[ -f "$FILENAME" ]]

会那样做。所以

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

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