# C# - <s>373</s> 349 chars

    using C=System.Console;class P{static void Main(string[] z){try{for(dynamic c,p=z[0],a=new int[30000],s=new int[9],f=1>0,i=0,d=0,t=0;;){c=p[i];if(f&c==62)++d;if(f&c==60)--d;if(f&c==43)++a[d];if(f&c==45)--a[d];if(f&c==46)C.Write((char)a[d]);if(f&c==44)a[d]=C.Read();if(c==91)s[t++]=f?(f=a[d]!=0)?i:-1:i;i=(c==93&&f&(f|=s[--t]<0))?s[t]:++i;}}catch{}}}

And more readable:

    using C=System.Console;
    class P
    {
        static void Main(string[] z)
        {
            try
            {
                for(dynamic c,p=z[0],a=new int[30000],s=new int[9],f=1>0,i=0,d=0,t=0;;)
                {
                    c=p[i];
                    if(f&c==62)++d;
                    if(f&c==60)--d;
                    if(f&c==43)++a[d];
                    if(f&c==45)--a[d];
                    if(f&c==46)C.Write((char)a[d]);
                    if(f&c==44)a[d]=C.Read();
                    if(c==91)s[t++]=f?(f=a[d]!=0)?i:-1:i;
                    i=(c==93&&f&(f|=s[--t]<0))?s[t]:++i;
                }
            }
            catch{}
        }
    }

Limitation is it only handles nested `[` up to 9 deep. Can make the `s` array bigger to handle more.

Edit 373 -> 349: Removed outer loop (was for a different site), character comparisons to integers, moved `c` declaration into the for loop