Dartmouth BASIC seems to have gotten strings around 1968, and BASIC uses the $ on variable names to indicate that they're strings. This is a strategy for avoiding the need for explicit type declarations. I imagine that type declarations would have been considered an unwanted barrier to user-friendliness, and they would have also been a a poor fit because the language lacked any syntax at levels broader than the level of one statement (no begin-end, etc.). (Most implementations after Dartmouth BASIC were pure statement-by-statement interpreters.)
The first Unix shell came out in 1971. The Bourne shell uses a similar (but prefixed) $ syntax, although it has more to do with dereferencing and string interpolation. Perl, which is basically shell on steroids, uses the sigils $, @, and % in a manner similar to Dartmouth BASIC's, as an alternative to explicit typing (although the distinction being made is a different one, and they are also used for string interpolation).
Was the use of sigils as an alternative to type declarations an innovation of Dartmouth BASIC, or was it present in some earlier system such as the Multics shell (which I believe inspired the Bourne shell)?
150 IF X < Y THEN 200should perform a numeric comparison or a string comparison should not require examining anything else in the code, and should not be affected by anything else the program has done.