1

这两个分配(i 和 C 省略第一个无效)有什么作用?它是变量的某种正则表达式吗?我尝试使用 bash,但到目前为止,在使用"${i//\\/\\\\}"or实例化它们之后,我的字符串的输出没有任何变化"\"${i//\"/\\\"}\""

C=''
for i in "$@"; do
    i="${i//\\/\\\\}"
    C="$C \"${i//\"/\\\"}\""
done
4

2 回答 2

2

这是 bash参数扩展

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

检查http://wiki.bash-hackers.org/syntax/pe

于 2018-09-07T12:43:24.080 回答
2

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

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

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

例如:

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

下一行执行另一个参数扩展:

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

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

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

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

cmd "${@//\\/\\\\}" # replaces all \ with \\ in each argument
于 2018-09-07T12:48:08.503 回答