我有一个脚本,它在各种目录下收集文件名,为特定模式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之前得到空文件内容。有人能指出我失踪的东西吗?
答案 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也会让您了解不存在的文件。这是一个关于你想控制多少错误条件的问题。