There are two main mistakes here, in a variety of combinations.
- Use - $to get the value of a variable, never when setting the variable (or changing its properties):
 - $var=value    # Bad
var=value     # Good
var=$othervar # Also good
 
- Spaces are critical delimiters in shell syntax; adding (or removing) them can change the meaning of a command in unexpected ways: - var = value    # Runs `var` as a command, passing "=" and "value" as arguments
var=val1 val2  # Runs `val2` as a command, with var=val1 set in its environment
var="val1 val2"  # Sets `var1` to `val1 val2`
 - So, in this command: - iperf_options=" -O 10 -V -i 10 --get-server-output -P " $streams
 - The space between - iperf_options="..."and- $streamsmeans that it'll expand- $streamsand try to run it as a command (with- iperf_optionsset in its environment). You want something like:
 - iperf_options=" -O 10 -V -i 10 --get-server-output -P $streams"
 - Here, since - $streamsis part of the double-quoted string, it'll be expanded (variable expand inside double-quotes, but not in single-quoted), and its value included in the value assigned to- iperf_options.
 
There's actually a third mistake (or at least dubious scripting practice): building lists of options as simple string variables. This works in simple cases, but fails when things get complex. If you're using a shell that supports arrays (e.g. bash, ksh, zsh, etc, but not dash), it's better to use those instead, and store each option/argument as a separate array element, and then expand the array with "${arrayname[@]}" to get all of the elements out intact (yes, all those quotes, braces, brackets, etc are actually needed).
proto="-u"    # If this'll always have exactly one value, plain string is ok
streams=2     # Same here
iperf_options=(-O 10 -V -i 10 --get-server-output -P "$streams")
iperf_options=("${iperf_options[@]}" "$proto")
# ...
iperf "${iperf_options[@]}"
Finally, I recommend shellcheck.net to sanity-check your scripts for common mistakes. A warning, though: it won't catch all errors, since it doesn't know your intent. For instance, if it sees var=val1 val2 it'll assume you meant to run val2 as a command and won't flag it as a mistake.