这是 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//\"/\\"}
${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
这两个赋值(i 和 C 省略第一个赋值)是做什么的?它是变量的某种正则表达式吗?我尝试使用 bash,但到目前为止,在使用 "${i//\/\\}"
或 "\"${i//\"/\\"}\""
C=''
for i in "$@"; do
i="${i//\/\\}"
C="$C \"${i//\"/\\"}\""
done
是bash 参数扩展
- 它用双反斜杠替换所有反斜杠:
"${i//\/\\}
- 它替换所有
\"
by \"
:${i//\"/\\"}
${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