Se você olhar para /usr/sbin/update-java-alternatives , verá que iterates /usr/lib/jvm/.*.jinfo para encontrar as versões instaladas, para que você possa fazer o mesmo para detectar as versões instaladas.
Quanto a não modificar PATH a cada vez, você pode contornar PATH completamente dizendo ao bash qual binário deve ser usado para java com o comando hash embutido (run help hash ).
Veja aqui algo sobre o que você pode construir:
java_use() {
local file version versions=()
for file in /usr/lib/jvm/.*.jinfo; do
[[ -e $file ]] || continue
version=${file##*/.} version=${version%.jinfo}
versions+=("$version")
done
if (( ${#versions[@]} == 0 )); then
printf >&2 'No java installed\n'
return 1
fi
select version in "${versions[@]}"; do
if [[ -n $version ]]; then
export JAVA_HOME="/usr/lib/jvm/$version"
hash -p "$JAVA_HOME/bin/java" java
break
fi
done
type java
}