My OS is Linux (kernel 4.08.something) and AIX (7100-04-01-1543), the used ksh versions are:
ksh88: Version M-11/16/88f (AIX)
ksh93: Version M 93t+ 2009-05-01 (AIX), Version M 93u (Linux)
When writing a parser for stanza files in ksh
i encountered a rather strange behavior. Here is a stripped down version of the parsing loop (i left out the actual parsing for clarity if anyone is interested i can post it), i marked the two critical lines in bold:
#! /bin/ksh
typeset chLine=""
typeset chChar=""
while read chLine ; do
print - "-- Begin Line: $chLine"
while [ -n "$chLine" ] ; do
chChar="${chLine%${chLine#?}}"
chLine="${chLine#?}"
print - "\n Line: \"$chLine\""
print - " Char: \"$chChar\""
done
done < /iput/file
exit 0
Here is the output of this with the sample file (1 line) containing item=value
, which works as expected:
# ./parsetest.sh
-- Begin Line: item=value
Line: "tem=value"
Char: "i"
Line: "em=value"
Char: "t"
Line: "m=value"
Char: "e"
Line: "=value"
Char: "m"
Line: "value"
Char: "="
Line: "alue"
Char: "v"
Line: "lue"
Char: "a"
Line: "ue"
Char: "l"
Line: "e"
Char: "u"
Line: ""
Char: "e"
Now, because i wanted to have comments in my stanza files (which the parser should filter out), but needed to make escaped comment chars possible i tried with the line item=val\\#ue
. Here is the output running above script with with ksh88
, which is as expected:
-- Begin Line: item=val\#ue
Line: "tem=val\#ue"
Char: "i"
Line: "em=val\#ue"
Char: "t"
Line: "m=val\#ue"
Char: "e"
Line: "=val\#ue"
Char: "m"
Line: "val\#ue"
Char: "="
Line: "al\#ue"
Char: "v"
Line: "l\#ue"
Char: "a"
Line: "\#ue"
Char: "l"
Line: "#ue"
Char: "\"
Line: "ue"
Char: "#"
Line: "e"
Char: "u"
Line: ""
Char: "e"
But - and this is where it gets weird - if the script is run with ksh93
, the characterwise chopping off from the main string stops to work correctly:
# ./parsetest.sh
-- Begin Line: item=val\#ue
Line: "tem=val\#ue"
Char: "item=val\#ue"
Line: "em=val\#ue"
Char: "tem=val\#ue"
Line: "m=val\#ue"
Char: "em=val\#ue"
Line: "=val\#ue"
Char: "m=val\#ue"
Line: "val\#ue"
Char: "=val\#ue"
Line: "al\#ue"
Char: "val\#ue"
Line: "l\#ue"
Char: "al\#ue"
Line: "\#ue"
Char: "l\"
Line: "#ue"
Char: "\"
Line: "ue"
Char: "#"
Line: "e"
Char: "u"
Line: ""
Char: "e"
Notice, that as long as the escape char is present in the string the variable expansion in the two marked lines seems not to work correctly.
Does anyone have an explanation for this or have i just encountered a bug?
bakunin