使用存储在变量中的文件名输出文件内容

时间:2016-10-03 15:26:08

标签: bash file cat

我有一个脚本,它在各种目录下收集文件名,为特定模式greget它们,并将该输出发送到另一个脚本。我遇到了获取文件内容的问题,我得不到任何结果或者没有这样的文件或目录错误"。文件名可能包含空格,所以我尝试过:

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之前得到空文件内容。有人能指出我失踪的东西吗?

2 个答案:

答案 0 :(得分:3)

 private void dg_Loaded(object sender, RoutedEventArgs e)
    {
        var groups = (this.Resources["CvsKey"] as CollectionViewSource).View.Groups;
        dg.ItemsSource = groups;
    }

错误是因为我们通过省略&#39; $&#39;来设置变量。字首。此外,您将static string IntToBinary(int n) { char[] b = new char[32]; int pos = 31; int i = 0; while (i < 32) // Loops over each of the 32-bit positions while writing ones and zeros. { if ((n & (1 << i)) != 0) { b[pos] = '1'; } else { b[pos] = '0'; } pos--; i++; } return new string(b).TrimStart('0'); // TrimStart removes leading zeroes. } static void Main() { Console.WriteLine(IntToBinary(300)); } 变量设置为字符串$FILENAME="cat $FILENAME" echo $FILENAME | grep "pattern" 。代替:

FILENAME

但是在接下来的名字中,您将要更改文件的内容,这可以通过以下方式完成,而无需将文件内容存储在自己的变量中:

CAT $FILENAME

第二次尝试:

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

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

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

grep "pattern" "$FILENAME"

而不是FILENAME=$(printf %q "$FILENAME") $(cat "$FILENAME") | grep "pattern" 将内容放入FILECONTENT=$(<"$FILENAME") echo "$FILECONTENT" | grep "pattern" 变量中,而是使用重定向。无论哪种方式,它都是多余的,因为文件的内容不需要存储在变量中,它已经存在于文件本身中。你的第二行是正确的,但我怀疑重定向在第一行失败,所以它是一个洗涤。

答案 1 :(得分:0)

如果文件名正确,可能值得测试:

[[ -f "$FILENAME" ]]

会这样做。所以

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

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