这两个分配(i和C将第一个分配作废)做了什么?变量使用某种正则表达式吗?我尝试使用bash,但到目前为止,用"${i//\\/\\\\}"
或"\"${i//\"/\\\"}\""
实例化字符串后,字符串的输出没有变化
C=''
for i in "$@"; do
i="${i//\\/\\\\}"
C="$C \"${i//\"/\\\"}\""
done
答案 0 :(得分:2)
这是重击参数扩展
"${i//\\/\\\\}
\"
by \\"
:${i//\"/\\\"}
答案 1 :(得分:2)
${i//\\/\\\\}
是一个看起来有点复杂的参数扩展:
它通过以下方式扩展变量$i
:
${i//find/replace}
表示将“ find”的所有实例替换为“ replace”。在这种情况下,要查找的是\
,它本身需要与另一个\
进行转义。\
,每个都需要转义。例如:
$ i='a\b\c'
$ echo "${i//\\/\\\\}"
a\\b\\c
下一行执行另一个参数扩展:
"
(由于它在双引号字符串内,因此需要转义)\"
替换(双引号和反斜杠都必须转义)。看起来循环的意图是建立一个字符串C
,试图安全地引用/转义传递给脚本的参数。这种类型的方法通常容易出错,直接使用输入数组可能会更好。例如,传递给脚本的参数可以安全地传递给另一个命令,例如:
cmd "$@" # does "the right thing" (quotes each argument correctly)
如果您确实需要转义反斜杠,也可以这样做:
cmd "${@//\\/\\\\}" # replaces all \ with \\ in each argument