Mike Stroyan wrote:
Repeat-By: a=111.1 echo ${a//[0-9]/x}correctly gives "xxx.x", but echo ${a//[0-9]/*} gives a listing of files in current directory. Seems that the "*" is expanded before replacing the pattern. It workes the right way at least up to bash-3.1.17(1)-release But if you set a=111 it doesn't even work in 3.1.17 right.The pathname expansion of "*" is not done until after the parameter expansion substitution. That is the documented behavior. The following example shows that echo of the "***.*" pattern matches files and directories that have a "." in their name. Setting a to "111" results in a pathname pattern of "***" that matches all of the files. Double quoting the substitution prevents pathname expansion. $ echo $BASH_VERSION 3.2.25(1)-release $ touch a b c.d e.f $ ls a b c.d e.f $ a=111.1 $ echo ${a//[0-9]/*} c.d e.f $ echo "${a//[0-9]/*}" ***.* $ a=111 $ echo ${a//[0-9]/*} a b c.d e.f $ echo "${a//[0-9]/*}" ***$
Thanks a lot for your fast response! Ok, even after so many years bash is astounding if you don't have all expansion rules in mind every time. Kind regards, Ado
