输出文件内容,文件名存储在变量中
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 也会让您知道不存在的文件。这是一个关于你想在多大程度上控制错误条件的问题。
我有一个脚本可以收集不同目录下的文件名,根据特定模式对它们进行 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 也会让您知道不存在的文件。这是一个关于你想在多大程度上控制错误条件的问题。