A few potential concerns:
1. Does shp8 also use a constructed list? If so, [% shp8_rX %] may return blank if X isn't in the constructed list. Then your code ends up with this invalid script: "... && >= 1." This little workaround will give you zero when the Sawtooth Script wants to return a blank string:
Number('[% shp8_rX %]')
3. If I recall correctly, SSI_GetValue never returns a blank string for numeric fields; it returns zero instead. To determine if a numeric field is blank, you can use jQuery instead:
$('#shp8b_rX_c1').val() === ''
Hopefully this is helpful for you. I can be of assistance if you need anything else.