shortcode_atts – one URL variable not working

First of all, you’re using extract / shortcode_atts in correctly:

The line:

   extract(shortcode_atts(array(
        "li" => get_option('li'),
    ), $liatts));

uses shortcode_atts and then extracts turns each key in the returnarray into its own variable: e.g. $li in this example. But you then go onto use $liatts anyway – which is just the attributes passed from the shortcode and can contain anything. Nor does it has any defaults provided.

Judging from your example you want to do something like:

function lishortcode($liatts) {

  //Merge provide attributes with defaults. Whitelist attributes
  $atts = shortcode_atts(array(
             "url" => get_option('li'), 
             "foo" => "bar"
           ), $liatts));

  /* Url is in $atts['url']. Do something and then return something */

  return $atts['url'];
}

add_filter('widget_text', 'do_shortcode');
add_shortcode('LI', 'lishortcode');

See Codex, – note shortcode_atts() not only provides defaults for missing values, but also strips out any attributes you don’t specify. In the above example, only the ‘url’ and ‘foo’ attribute will be in present in $atts.