Parameter expansion stopped working in recent ash/dash
Brian Inglis
Brian.Inglis@Shaw.ca
Tue Feb 7 19:01:18 GMT 2023
On 2023-02-07 10:19, Brian Inglis via Cygwin wrote:
> On 2023-02-07 05:07, Andrey Repin via Cygwin wrote:
>> Greetings, All!
>>
>> In the attached script, that I always run using dash, the expansion is
>> supposed to strip leading/trailing spaces from provided parameter.
>>
>> The upgrade that took place after which the expansion stopped working is
>>
>> libsolv: - dash-0.5.11.5-1.any -> dash-0.5.12-1.any
>>
>> Downgrading to 0.5.11.5 restored the expected behavior.
>> I failed to find anything relevant in the dash 0.5.12 patch notes, but perhaps
>> community could help?
>
> Good catch Andrey,
>
> Looks like something in dash broke space trimming of any sort: see attached
> script and logs.
>
> I will see what upstream has to say for themselves, or about Cygwin.
Sorry Andrey,
Stupid errors in test script, didn't actually run trim3 anyway, redone, and that
and updated logs attached.
It appears the locale dependent [[:space:]] regexp no longer works but using
escapes generated by echo still does, see corrected trim3, so perhaps use those
for now, if you can, while I follow this upstream.
You may need to add escape sequences for any locale dependent spacing characters
to the space string, so please let us know if there are.
--
Take care. Thanks, Brian Inglis Calgary, Alberta, Canada
La perfection est atteinte Perfection is achieved
non pas lorsqu'il n'y a plus rien à ajouter not when there is no more to add
mais lorsqu'il n'y a plus rien à retirer but when there is no more to cut
-- Antoine de Saint-Exupéry
-------------- next part --------------
#!/bin/dash -vx
trim() {
# remove leading whitespace characters
__trim="${*#${*%%[![:space:]]*}}"
# remove trailing whitespace characters
printf "%s" "${__trim%${__trim##*[![:space:]]}}"
}
trim " alpha" | od -t x1a
+ trim alpha
+ __trim=alpha
+ printf %s alpha
+ od -t x1a
0000000 61 6c 70 68 61
a l p h a
0000005
trim "beta " | od -t x1a
+ trim beta
+ __trim=beta
+ printf %s beta
+ od -t x1a
0000000 62 65 74 61
b e t a
0000004
trim "
gamma " | od -t x1a
+ trim
gamma
+ __trim=gamma
+ printf %s gamma
+ od -t x1a
0000000 67 61 6d 6d 61
g a m m a
0000005
trim2() {
# remove leading whitespace characters
__trim="${*##[[:space:]]}"
# remove trailing whitespace characters
printf "%s" "${__trim%%[[:space:]]}"
}
trim2 " alpha" | od -t x1a
+ trim2 alpha
+ __trim=alpha
+ printf %s alpha
+ od -t x1a
0000000 61 6c 70 68 61
a l p h a
0000005
trim2 "beta " | od -t x1a
+ trim2 beta
+ __trim=beta
+ printf %s beta
+ od -t x1a
0000000 62 65 74 61
b e t a
0000004
trim2 "
gamma " | od -t x1a
+ trim2
gamma
+ __trim=gamma
+ printf %s gamma
+ od -t x1a
0000000 67 61 6d 6d 61
g a m m a
0000005
trim3() {
_space="$(echo -n '[\b\t\n\v\f\r ]')"
# remove leading whitespace characters
__trim="${*##$_space}"
# remove trailing whitespace characters
printf "%s" "${__trim%%$_space}"
}
trim3 " alpha" | od -t x1a
+ trim3 alpha
+ od -t x1a
+ echo -n [\b\t\n\v\f\r ]
+ _space=[
]
+ __trim=alpha
+ printf %s alpha
0000000 61 6c 70 68 61
a l p h a
0000005
trim3 "beta " | od -t x1a
+ trim3 beta
+ od -t x1a
+ echo -n [\b\t\n\v\f\r ]
+ _space=[
]
+ __trim=beta
+ printf %s beta
0000000 62 65 74 61
b e t a
0000004
trim3 "
gamma " | od -t x1a
+ trim3
gamma
+ + od -t x1a
echo -n [\b\t\n\v\f\r ]
+ _space=[
]
+ __trim=gamma
+ printf %s gamma
0000000 67 61 6d 6d 61
g a m m a
0000005
-------------- next part --------------
#!/bin/dash -vx
trim() {
# remove leading whitespace characters
__trim="${*#${*%%[![:space:]]*}}"
# remove trailing whitespace characters
printf "%s" "${__trim%${__trim##*[![:space:]]}}"
}
trim " alpha" | od -t x1a
+ trim alpha
+ __trim=
+ printf %s
+ od -t x1a
0000000
trim "beta " | od -t x1a
+ trim beta
+ __trim=
+ printf %s
+ od -t x1a
0000000
trim "
gamma " | od -t x1a
+ trim
gamma
+ __trim=
+ printf %s
+ od -t x1a
0000000
trim2() {
# remove leading whitespace characters
__trim="${*##[[:space:]]}"
# remove trailing whitespace characters
printf "%s" "${__trim%%[[:space:]]}"
}
trim2 " alpha" | od -t x1a
+ trim2 alpha
+ __trim= alpha
+ printf %s alpha
+ od -t x1a
0000000 20 61 6c 70 68 61
sp a l p h a
0000006
trim2 "beta " | od -t x1a
+ trim2 beta
+ __trim=beta
+ printf %s beta
+ od -t x1a
0000000 62 65 74 61 20
b e t a sp
0000005
trim2 "
gamma " | od -t x1a
+ trim2
gamma
+ __trim=
gamma
+ printf %s
gamma
+ od -t x1a
0000000 0d 67 61 6d 6d 61 09
cr g a m m a ht
0000007
trim3() {
_space="$(echo -n '[\b\t\n\v\f\r ]')"
# remove leading whitespace characters
__trim="${*##$_space}"
# remove trailing whitespace characters
printf "%s" "${__trim%%$_space}"
}
trim3 " alpha" | od -t x1a
+ trim3 alpha
+ od -t x1a
+ echo -n [\b\t\n\v\f\r ]
+ _space=[
]
+ __trim=alpha
+ printf %s alpha
0000000 61 6c 70 68 61
a l p h a
0000005
trim3 "beta " | od -t x1a
+ trim3 beta
+ od -t x1a
+ echo -n [\b\t\n\v\f\r ]
+ _space=[
]
+ __trim=beta
+ printf %s beta
0000000 62 65 74 61
b e t a
0000004
trim3 "
gamma " | od -t x1a
+ trim3
gamma
+ od -t x1a
+ echo -n [\b\t\n\v\f\r ]
+ _space=[
]
+ __trim=gamma
+ printf %s gamma
0000000 67 61 6d 6d 61
g a m m a
0000005
-------------- next part --------------
#!/bin/dash -vx
trim() {
# remove leading whitespace characters
__trim="${*#${*%%[![:space:]]*}}"
# remove trailing whitespace characters
printf "%s" "${__trim%${__trim##*[![:space:]]}}"
}
trim " alpha" | od -t x1a
trim "beta " | od -t x1a
trim "
gamma " | od -t x1a
trim2() {
# remove leading whitespace characters
__trim="${*##[[:space:]]}"
# remove trailing whitespace characters
printf "%s" "${__trim%%[[:space:]]}"
}
trim2 " alpha" | od -t x1a
trim2 "beta " | od -t x1a
trim2 "
gamma " | od -t x1a
trim3() {
_space="$(echo -n '[\b\t\n\v\f\r ]')"
# remove leading whitespace characters
__trim="${*##$_space}"
# remove trailing whitespace characters
printf "%s" "${__trim%%$_space}"
}
trim3 " alpha" | od -t x1a
trim3 "beta " | od -t x1a
trim3 "
gamma " | od -t x1a
More information about the Cygwin
mailing list