Shortcode Showing at Top of Pge

I am working on a custom function to pull content in from a theme options table.

This works fine:
function site_speciality($optionname) {
get_option ('site_special_options')[$optionname];

I call it like this.
echo site_specialty ('option-name');

I would like to turn this into shortcode I can use on pages too. But you can't seem to use echo in shortcodes. I know this is why:

So I tried this as a solution:

function site_shortcode_option_name(){
site-speciality ('option-name');
$output_string = ob_get_contents();
return $output_string;
add_shortcode( 'option-name', 'site_shortcode_option_name' );

This echo's the "option-name" content, but at the top of the page. Anyone know what I am missing here? Is there some other option than echo'ing so it won't be at the top?