addition to my greycat-answer mail .. i didnt use & there at all , my fault .. but with & its no else
root@localhost:~# a=i_am_foo b=_ c=${b}am$b d=$b\&$b e=${a//"$c"/"$d"} ; printf ' --> %s\n' "$e" "${a//"$c"/"$d"}" --> i_&_foo --> i_&_foo sorry short imo , the ' " not parsing is outdated , and got fixed later u may want bash v<1 compatibility ? i just say its two horsrs , one about old and keep , the other about new and updated On Fri, Nov 4, 2022, 17:22 Alex fxmbsw7 Ratchev <fxmb...@gmail.com> wrote: > > > On Fri, Nov 4, 2022, 17:03 Greg Wooledge <g...@wooledge.org> wrote: > >> On Fri, Nov 04, 2022 at 01:30:16PM +0100, Alex fxmbsw7 Ratchev wrote: >> > > 1) Put something like "shopt -u patsub_replacement 2>/dev/null || >> true" >> > > at the top of your script. >> > > >> > >> > there d be many such senselessnesses >> > >> > > >> > > 2) Assign the result of the expansion to a temporary variable, and >> pass >> > > the temp var to somecmd. Every. Single. Time. >> > > >> > >> > ? i dont get that >> >> OK. Let me offer a quick example script. It works as expected in >> bash-5.1: >> >> unicorn:~$ cat foo >> #!/bin/bash >> template='The best candy is clearly @CANDY@!' >> candy='M&Ms' >> printf '%s\n' "${template/@CANDY@/"$candy"}" >> >> unicorn:~$ ./foo >> The best candy is clearly M&Ms! >> >> Now, let's run this script under bash-4.2: >> >> unicorn:~$ bash-4.2 ./foo >> The best candy is clearly "M&Ms"! >> >> Uh oh! The quotes are wrong for bash-4.2. Bug #1 is filed for this >> issue. >> As the maintainer of the script, I test a few things between bash-4.2 >> and bash-5.1 and I come up with this workaround: >> >> unicorn:~$ cat foo >> #!/bin/bash >> template='The best candy is clearly @CANDY@!' >> candy='M&Ms' >> printf '%s\n' "${template/@CANDY@/$candy}" # unquote $candy to fix >> bug #1 >> >> unicorn:~$ bash-4.2 ./foo >> The best candy is clearly M&Ms! >> unicorn:~$ bash-5.1 ./foo >> The best candy is clearly M&Ms! >> >> Now it works on older systems too. Everything's fine... until bash-5.2. >> >> unicorn:~$ bash-5.2 ./foo >> The best candy is clearly M@CANDY@Ms! >> >> The workaround for bug #1 causes bug #2 on bash-5.2. To make the script >> work on all three versions of bash, we need a different workaround: >> >> unicorn:~$ cat foo >> #!/bin/bash >> template='The best candy is clearly @CANDY@!' >> candy='M&Ms' >> message=${template/@CANDY@/"$candy"} # Work around bug #1 and >> #2. >> printf '%s\n' "$message" >> >> unicorn:~$ bash-4.2 ./foo >> The best candy is clearly M&Ms! >> unicorn:~$ bash-5.1 ./foo >> The best candy is clearly M&Ms! >> unicorn:~$ bash-5.2 ./foo >> The best candy is clearly M&Ms! >> >> And there you have it. You're allowed to quote "$candy" in a variable >> assignment, as long as the whole parameter expansion ${...} remains >> unquoted, and it'll work properly in all 3 versions. I'm using "message" >> as a temporary variable, whose sole purpose is to work around this issue. >> > > mate , thank you for investing time in explainmennts > > what on yours i ask , o i see now , 4.2 .. > i quote right in ${ // - to me , preserved quotes are • an invalid youth > bug to be replaced with better by bash.c changes > which it seemfully did > > is quotes preserveness the only bug here i see ? > > root@localhost:~# a=i_am_foo b=_ c=${b}am$b d=${b}be$b e=${a//"$c"/"$d"} > ; printf ' --> %s\n' "$e" "${a//"$c"/"$d"}" > --> i_be_foo > --> i_be_foo > > for me , trying to support such wrongness , resulted ( along other same > logics.. ) in a 'best is newest upstream version' rule > >>