When you run a shell script, it's done in a sub-shell so it cannot affect the parent shell's environment(1). You want to source the script by doing:
. ./setfoo.sh
This executes it in the context of the current shell, not as a sub shell.
From the bash man page:
. filename [arguments]
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command executed
from filename.
If filename does not contain a slash, file names in PATH are used to
find the directory containing filename.
The file searched for in PATH need not be executable. When bash is not
in POSIX mode, the current directory is searched if no file is found
in PATH.
If the sourcepath option to the shopt builtin command is turned off,
the PATH is not searched.
If any arguments are supplied, they become the positional parameters
when filename is executed.
Otherwise the positional parameters are unchanged. The return status
is the status of the last command exited within the script (0 if no
commands are executed), and false if filename is not found or cannot
be read.
(1) The intent of the export command is not to make variables accessible to the parent of a shell, it's to make them accessible to its children.
Let's say you have two shell scripts as follows, first script1.bash:
xyzzy=plugh # Set the variable.
./script2.bash # Execute in sub-shell.
. ./script2.bash # Execute in THIS shell.
export xyzzy # Mark variable for export.
./script2.bash # Execute in sub-shell again.
Then the script2.bash script which simply echoes the value:
echo "xyzzy=[$xyzzy]"
If you run that, you'll see that only an exported variable is seen in the sub-shell:
xyzzy=[] # Non-exported, not seen in sub-shell.
xyzzy=[plugh] # Non-exported, seen in same shell.
xyzzy=[plugh] # Exported, seen in sub-shell.
As mentioned, sourcing the script in the context of the current shell means the variable is available without export. It also mans you could change the variable there and have it affect the caller, since that caller is not the parent shell, but the same shell.