这是 bash 变量实例化中的某种正则表达式吗?

Is this some kind of regex within bash variable instantiation?

这两个赋值(i 和 C 省略第一个赋值)是做什么的?它是变量的某种正则表达式吗?我尝试使用 bash,但到目前为止,在使用 "${i//\/\\}""\"${i//\"/\\"}\""

实例化字符串后,我的字符串输出没有任何变化
C=''
for i in "$@"; do
    i="${i//\/\\}"
    C="$C \"${i//\"/\\"}\""
done

是bash 参数扩展

  • 它用双反斜杠替换所有反斜杠:"${i//\/\\}
  • 它替换所有 \" by \" : ${i//\"/\\"}

勾选http://wiki.bash-hackers.org/syntax/pe

${i//\/\\}是一个看起来稍微复杂的参数展开:

它以下列方式扩展变量$i

  • ${i//find/replace} 表示将 "find" 的所有实例替换为 "replace"。在这种情况下,要查找的是 \,它本身需要用另一个 \.
  • 转义
  • 替换为两个\,每个都需要转义。

例如:

$ i='a\b\c'
$ echo "${i//\/\\}"
a\b\c

下一行再进行一次参数展开:

  • 找到"(需要转义,因为它在双引号字符串中)
  • 替换为\"(双引号和反斜杠都需要转义)

看起来循环的目的是构建一个字符串 C,试图安全地 quote/escape 传递给脚本的参数。这种方法通常容易出错,直接使用输入数组可能会更好。例如,传递给脚本的参数可以安全地传递给另一个命令,如:

cmd "$@" # does "the right thing" (quotes each argument correctly)

如果你真的需要转义反斜杠,你也可以这样做:

cmd "${@//\/\\}" # replaces all \ with \ in each argument