我有一个脚本来重命名包含特定字符串的文件或一系列文件
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指南,但仍然没有任何线索。谢谢
答案 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!