关于bash参数替换的困惑

时间:2015-02-01 22:21:20

标签: bash shell

我有一个脚本来重命名包含特定字符串的文件或一系列文件

for i in "${@:3}"; do
        mv -- "$i" "${i/$1/$2}"
done

所以当我做的时候

bash script_name patter_1 pattern_2 string*

它确实有效,但是当我尝试时:

mv -- "$i" "${i//$1/$2}"  

它仍然有效

${i/$1/$2} 

${i//$1/$2} 

那么为什么会发生这种情况,我会为初学者搜索bash指南,但仍然没有任何线索。谢谢

1 个答案:

答案 0 :(得分:2)

来自bash manual

  

$ {参数/模式/字符串}

     

扩展模式以生成与文件名一样的模式   扩张。参数被扩展并且模式的最长匹配   反对其值被替换为字符串。 如果模式开始于   '/',模式的所有匹配都用字符串

替换

因此,如果替换只能进行一次,则这些是等效的:

${parameter/pattern/string}
           ^
${parameter//pattern/string}
           ^^

查看示例:

$ i="hello"
$ echo ${i/e/XX}  #just one replacement
hXXllo            # <----------------------
$ echo ${i//e/XX} # multiple replacements  | they are the same
hXXllo            # <----------------------
$ echo ${i/l/XX}  #just one replacement
heXXlo            # it just happens once!
$ echo ${i//l/XX} #multiple replacements
heXXXXo           # it happens many times!