这两个分配(i 和 C 省略第一个无效)有什么作用?它是变量的某种正则表达式吗?我尝试使用 bash,但到目前为止,在使用"${i//\\/\\\\}"
or实例化它们之后,我的字符串的输出没有任何变化"\"${i//\"/\\\"}\""
C=''
for i in "$@"; do
i="${i//\\/\\\\}"
C="$C \"${i//\"/\\\"}\""
done
这两个分配(i 和 C 省略第一个无效)有什么作用?它是变量的某种正则表达式吗?我尝试使用 bash,但到目前为止,在使用"${i//\\/\\\\}"
or实例化它们之后,我的字符串的输出没有任何变化"\"${i//\"/\\\"}\""
C=''
for i in "$@"; do
i="${i//\\/\\\\}"
C="$C \"${i//\"/\\\"}\""
done
这是 bash参数扩展
"${i//\\/\\\\}
\"
by \\"
:${i//\"/\\\"}
${i//\\/\\\\}
是一个看起来有点复杂的参数展开:
$i
它以下列方式扩展变量:
${i//find/replace}
表示用“replace”替换所有“find”实例。在这种情况下,要找到的是\
,它本身需要与另一个 一起转义\
。\
,每个都需要转义。例如:
$ i='a\b\c'
$ echo "${i//\\/\\\\}"
a\\b\\c
下一行执行另一个参数扩展:
"
(需要转义,因为它在双引号字符串中)\"
(双引号和反斜杠都需要转义)。看起来循环的目的是构建一个 string C
,尝试安全地引用/转义传递给脚本的参数。这种方法通常容易出错,直接使用输入数组可能会更好。例如,传递给脚本的参数可以安全地传递给另一个命令,例如:
cmd "$@" # does "the right thing" (quotes each argument correctly)
如果你真的需要转义反斜杠,你也可以这样做:
cmd "${@//\\/\\\\}" # replaces all \ with \\ in each argument