bash变量实例化中是否存在某种正则表达式?

时间:2018-09-07 12:41:58

标签: bash parameter-expansion

这两个分配(i和C将第一个分配作废)做了什么?变量使用某种正则表达式吗?我尝试使用bash,但到目前为止,用"${i//\\/\\\\}""\"${i//\"/\\\"}\""实例化字符串后,字符串的输出没有变化

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

2 个答案:

答案 0 :(得分:2)

这是重击参数扩展

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

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

答案 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