bash参数替换的困惑
我有一个脚本来重命名一个文件或一系列包含特定字符串的文件bash参数替换的困惑,bash,shell,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} 及 那个么为什么会发生这种情况呢?我在bash指南中搜索初学者,但仍然并没有任何线索。感
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}
及
那个么为什么会发生这种情况呢?我在bash指南中搜索初学者,但仍然并没有任何线索。感谢您来自:
${parameter/pattern/string}
模式被扩展以产生一个模式,就像在文件名中一样
膨胀参数展开,模式的最长匹配
将其值替换为字符串如果模式以开始
“/”,模式的所有匹配项都替换为字符串
因此,如果更换只需进行一次,则这些是等效的:
${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!
$i=“你好”
$echo${i/e/XX}#只需一个替换
hXXllo#
$ 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!