Replace:
if [ -z `cat rvm_check.txt | grep not` ]
With:
if ! grep -q not rvm_check.txt
The reason to use test in an if statement is because it sets an exit code that the shell uses to decide to go to the then or else clause. grep also sets an exit code. Consequently there is no need for test, [, here. grep sets the exit code to success (0), if it found the string. You want success to be if the string is not found. Thus, we negate the exit code result by using !.
Explanation
The test command, [, expects a single string to follow -z. If the grep command produces more than one word, then the test will fail with the error that you saw.
As an example, consider this sample file:
$ cat rvm_check.txt
one not two
The output of grep looks like:
$ cat rvm_check.txt | grep not
one not two
When test is executed all three words appear inside the [...] causing the command to fail:
$ [ -z `cat rvm_check.txt | grep not` ]
bash: [: too many arguments
This is just the same as if you had entered:
$ [ -z one not two ]
bash: [: too many arguments
One solution for that is to use double-quotes:
$ [ -z "`cat rvm_check.txt | grep not`" ]
Double-quotes prevent the shell from performing word splitting. As a result, the output from grep here is treated as a single string, not split into separate words.
However, since grep sets a sensible exit code, there is, as shown in the recommended line above, no need for test.
Additional comments
The currently preferred form for command substitution is $(...). While backticks still work, they are fragile. In particular, backticks cannot be nested.
On commands that take filenames on the command, the use of cat is unnecessary. Instead of:
cat somefile | grep something
Just use:
grep something somefile