at the start of a string after I pass in variables from the command line. I only noticed this when I set -x in my KSH script. Can anybody tell me how this happens and how to remove them?
Many thanks.
If the characters are stored in OPT by the command OPT=$* , then those characters were typed on the command line when your script was invoked.
One would not expect this if your script was invoked by typing commands into a shell.
One would not expect this if your script was invoked by a shell script edited with ed , ex , vi or another common UNIX system text editor.
One would expect this if your script was invoked by a shell script edited with a text editor designed to produce pretty-printed text (such as Microsoft word or Apple pages ).
I second Don Cragun in his third expectation; that's why I asked how you called the script (which unfortunately you did not answer). It looks like your parent script scrambles character (set)s as the case statement evaluates and recognizes -OPT correctly but then obviously fails when providing the option values themselves.
It's caused when the first character in the options field is a dash. I'm calling the script from the command line. The script was edited using vi. Here's the full output with debug when I use '-options -debug':
If you look closely, you'll see that the character before "username", "surname", "address", "startdate", "req", and "options" is a <hyphen> or <minus-sign>, but the character before "debug" is wider. It is what Unicode calls an <en-dash>. If we feed that line through od and look at it as octal bytes and characters we can easily see the difference:
0000000 056 057 164 145 163 164 056 153 163 150 040 055 165 163 145 162
. / t e s t . k s h - u s e r
0000020 156 141 155 145 040 165 163 145 162 061 040 055 163 165 162 156
n a m e u s e r 1 - s u r n
0000040 141 155 145 040 165 163 145 162 062 040 055 141 144 144 162 145
a m e u s e r 2 - a d d r e
0000060 163 163 040 141 142 143 061 062 063 040 055 163 164 141 162 164
s s a b c 1 2 3 - s t a r t
0000100 144 141 164 145 040 061 062 063 040 055 162 145 161 040 064 040
d a t e 1 2 3 - r e q 4
0000120 055 157 160 164 151 157 156 163 040 342 200 223 144 145 142 165
- o p t i o n s - ** ** d e b u
0000140 147 012
g \n
0000142
Note that I marked the last hyphen and the en-dash in red in the od output. Each of the hyphens is a single byte with octal value 055 while the en-dash is three bytes with the octal values 342, 200, and 223, respectively.
When you give ksh an en-dash as an input character, it will give it back you you as an en-dash (and not convert it to a hyphen). If you want a the string -debug with a hypen to be assigned to OPTS , give ksh a command line argument containing -debug with a hypen; not -debug with an en-dash.
A common cause is copy/pasting from a web page or a document where a word processor has replaced two consecutive minus-hyphen characters with a wide single one (short dash).
This is done by default at least with MS Word 2010.
I can only imagine I somehow pressed shift alt (on a mac) along with - when typing that in. It was the only place it occurred. It's great to now have an approach for working this out. Thanks guys.