Autocompletion - a feature I generally don't use in other contexts - and reduced functionality seem to be its main USPs. With readline, process substitution and subshells (for ad-hoc fork/join jobs started from the command line) it might be competitive with other shells.
For example, a reasonably common pattern for me, on the command line, is:
$ for d in *; do
test -d "$d" || continue
(
cd "$d"
time-consuming-task-1
time-consuming-task-2
) &
done
I don't think I could do this in fish today without writing a script, as it doesn't have subshells and can't run functions in the background.There's also a big advantage in having the shell be the same (or highly similar) to your preferred ad-hoc scripting language. It means you can retrieve complex commands from your history and paste them into the script, with only a slight cleanup to parameterize them. A whole complex operation can be spiked and tested interactively before being put together into something reusable - possibly without foreknowledge that the task is going to be that tedious, or needs to be encapsulated. Zsh looks like a better alternative to bash for these reasons.